Tips & Tricks

Đây là những lời khuyên và thủ thuật khi lập trình trên iOS, để có thể viết ứng dụng 1 cách tối ưu và phân phối ứng dụng của bạn cho khách hàng 1 cách dễ dàng nhất:

1. Sử dụng kiến trúc ARC để quản lý bộ nhớ:

ARC(Automatic Reference Counting) đã được phát hành trên iOS 5, giúp cho các lập trình viên trên iOS dễ dàng viết code, không cần quan tâm đến việc quản lý memory, giảm thiểu khả năng bị crash ứng dụng do leak memory.
Tài liệu của Apple giới thiệu về ARC.







2. Sử dụng cơ chế sử dụng lại (reuse) khi lập trình trên smartphone:

- Mặc định UITableView, UICollectionView đều hỗ trợ cơ chế sử dụng lại những cell trên đối tượng đó để có thể load lại những cell đó và hiển thị những thông tin mới trong 1 mảng dữ liệu. Theo cơ chế của hệ thống thì những cell nào mà hiển thị thì nó mới khởi tạo, vì thế khi bạn load xuống dưới thì system tự động thiết lập nội dung trên những cell đó lại thôi, không khởi tạo tiếp những đối tượng sau đó, để tránh phát sinh vùng nhớ không cần thiết.

- Bạn nên biết cách xử lý như thế nào để có thể tối ưu hoá bộ nhớ của máy vì 1 ứng dụng mà khởi tạo nhiều đối tượng trên 1 table sẽ làm chậm ứng dụng và có nguy cơ crash cao. Hướng dẫn dùng reuse trên UITableView. Mình thấy các bạn mới lập trình (iOS hoặc Android) hay làm sai cơ chế này, các bạn sau khi viết code nên debug chỗ khởi tạo đối tượng để kiểm tra lại biết có làm đúng hay không.

- Khi bạn cần load hình ảnh trên ScrollView cũng có thể dùng cách này để tối ưu hoá cách khởi tạo đối tượng.

3. Nên thiết lập thuộc tính Opaque của View:

- Mặc định thì thuộc tính này sẽ là YES. Nếu thuộc tính này bằng YES thì sẽ tối ưu hoá hệ thống khi vẽ lại đối tượng trên màn hình.

- Các bạn có thể xem chỗ miêu tả thuộc tính Opaque trong tài liệu của Apple.

- Nếu bạn viết code bình thường từng màn hình riêng biệt thì không thấy có sự khác biệt nhiều. Chỉ trừ khi nào bạn làm trên giao diện phức tạp và thêm những View trên ScrollView thì mới thấy hiệu quả của nó.




4. Nên sử dụng storyboard thay vì file xib:

- Tránh sử dụng FatXib (viết nhiều View hay ViewController trên 1 file xib), vì theo cơ chế của file xib nó sẽ load hết resource vào bộ nhớ cache khi bạn khởi tạo đối tượng chứa file xib đó, cho dù bạn có dùng hay không dùng đến những View đó, do đó sẽ làm giảm hiệu năng của ứng dụng.

- Nếu dùng file xib thì nên giới hạn 1 ViewController trên 1 file xib hoặc 1 View trên 1 file xib. Hoặc dùng cho những View custom bên ngoài vào trong 1 screen này đó.

- Storyboard được giới thiệu cùng với ARC trên iOS 5, nó nhanh chóng thay thế file xib trước đó. Storyboard có những ưu điểm và nhược điểm khi sử dụng nó như:
    + Ưu điểm: Tích hợp được nhiều View Controller trên 1 storyboard, thiết kế được luồng của từng màn hình trong ứng dụng, hỗ trợ việc load những resource của từng ViewController theo từng thời điểm thực thi.
    + Nhược điểm: Hay bị conflict khi lập trình trong team.

Tài liệu nói về file xib của Apple.

Tuỳ theo từng trường hợp như thế nào thì bạn cân nhắc dùng storyboard hay file xib.

5. Tránh tình trạng block main thread:

- Do UIKit thực thi những công việc giao diện màn hình trên Main Thread như vẽ UI, nhận những sự kiện từ user trên màn hình thiết bị... Vì thế nếu bạn làm những công việc khác mà xử lý lâu hay phức tạp nếu xử lý trên Main Thread thì sẽ gây ứng dụng cảm giác như hơi bị đứng lại và user không thể tương tác được với giao diện.

- Ví dụ như những công việc bạn cần download những file từ server về thì bạn nên dùng cơ chế bất đồng bộ hay chạy multithread để không làm ảnh hưởng trên Main Thread. Khi dùng connection mặc định của system, bạn nên dùng NSURLSession thay cho NSURLConnection, Apple giới thiệu NSURLSession trong iOS 7 và có nhiều điểm tốt hơn NSURLConnection, vì thế Apple cũng khuyến khích mọi người nên dùng đối tượng mới này. Bạn có thể xem hướng dẫn cách sử dụng NSURLSession thay cho NSURLConnection tại đây. Bạn có thể dùng những thư viện về connection như AFNetworking (Objective-C) hay Alamofire (Swift). Hướng dẫn dùng multithreading trên iOS bạn có thể xem tại đây.

- Hoặc mỗi khi bạn cần resize lại image khi lấy từ server về để cho cùng 1 size thì nên xử lý ở dưới background.

6. Sử dụng collection(Array, Dictionary, Set) hợp lý:

Mình có bài phân tích cách sử dụng các loại collection trong trang Objective-C. Có đề cập ưu nhược điểm của từng loại Collection. Hoặc có thể các bạn có thể đọc tài liệu trên trang của Apple.





7. Có thể sử dụng cơ chế GZIP để tối ưu hoá gói tin khi giao tiếp với server:

- Nếu gói tin của bạn trả về cho client quá lớn, nếu mạng yếu thì client có thể phải mất thời gian lâu để nhận gói tin đó về nếu dùng theo kiểu dữ liệu thông thường như XML hay JSON. Bạn có thể dùng cơ chế GZIP để có thể nén gói tin đó lại với dung lượng nhỏ hơn để có thể tải về được nhanh hơn. Đổi lại thì cách thực hiện của bạn sẽ phải thêm động tác nén (trên server) và giải nén (dưới client) mỗi khi chúng giao tiếp với nhau.

- Có bài hướng dẫn dùng GZIP các bạn có thể tham khảo làm theo.

- Có 1 bài phân tích của ông tiến sĩ về hệ thống GZIP của AHA so với hệ thống khác và hệ thống không sử dụng GZIP, các bạn có thể xem qua tại đây.

8. Sử dụng cơ chế Lazy Loading khi load những hình ảnh từ server lên trên Table View:

- Khi bạn làm 1 task như vậy thì bạn nên sử dụng cơ chế Lazy Loading để có thể hiển thị đúng image theo từng dữ liệu trong 1 cell của table.

- Có rất nhiều bài hướng dẫn cách làm này trên mạng. Đây là code demo của Apple, các bạn có thể tải về tại đây.













9. Sử dụng cơ chế cache:

- Đôi khi bạn muốn ứng dụng của bạn cải thiện tốc độ khi giao tiếp với server để chạy thật nhanh. Bạn nên cân nhắc sử dụng cơ chế cache để có thể thực hiện được việc đó.

- Trên server và client đều có cơ chế cache, vì thế cân nhắc làm sao cho thuận tiện và phù hợp với hệ thống của bạn. Vì khi bạn sử dụng cơ chế cache thì hết thời gian cache thì nó mới truy suất database để lấy dữ liệu mới, nên khi có sự thay đổi tại thời điểm đó bạn có thể chỉ lấy được những dữ liệu cũ từ bộ nhớ cache.

- Trong Lazy Loading cũng sử dụng cơ chế cache để có thể tối ưu hoá việc tải image lại.

- Tài liệu hướng dẫn sử dụng cache trên iOS các bạn có thể xem qua tại đây.

10. Hiệu năng xử lý đồ hoạ:

- Khi bạn xử lý đồ hoạ bằng những hàm vẽ thì nên đo và xử lý làm sao tối ưu nhất.

- Bài đo phân tích và đo hiệu năng khi bạn sử dụng thư viện về đồ hoạ trên iOS.



11. Quản lý memory warnings:

Nếu ứng dụng của bạn sử dụng nhiều bộ nhớ quá thì hệ thống sẽ đưa ra cảnh báo. Điều quan trọng là bạn không xử lý thì nguy cơ ứng dụng bị crash ứng dụng rất cao. Bạn nên xử lý huỷ những vùng nhớ đã được lưu trữ nhưng không còn sử dụng nữa để giải phóng vùng nhớ cho hệ thống để thực hiện những thao tác khác.

Có những cách để quản lý memory warnings trên iOS như:
- Nên override lại hàm didReceiveMemoryWarning trong từng ViewController.
- Xử lý hàm applicationDidReceiveMemoryWarning: trong AppDelegate.
- Đăng ký notification như UIApplicationDidReceiveMemoryWarningNotification.

Các bạn có thể giả lập bằng cách chọn "Hardware > Simulate Memory Warning" trên toolbar của Simulator.





12. Cách cài ứng dụng lên thiết bị để cho khách hàng và tester có thể test ứng dụng trong giai đoạn development:

Sau khi bạn export ra file IPA thì bạn tải file đó lên những service hỗ trợ cho việc cài đặt ứng dụng lên thiết bị thông qua url mà họ nhận được. Cách đây khoảng 3 hay 4 năm trước thì TestFlight hỗ trợ cách này rất tốt, cài đặt ứng dụng mà không phụ thuộc vào provisioning và thiết bị nào nhận được đường link đó đều có thể cài được. Hiện tại thì Apple hình như mua TestFlight và tích hợp chúng vào iTuneConnect, sử dụng TestFlight như giai đoạn Beta Test trước khi bạn release ứng dụng lên App Store.

- Nếu bạn không thích dùng TestFlight thì bạn có thể dùng service của diawi. Service này rất tối ưu không cần bạn đăng nhập gì cả, công việc của bạn là tải file IPA lên thông qua trang web của diawi. Có thể tạo mật khẩu để giới hạn người cài được, bạn có thể theo dõi thiết bị cài thông qua thông tin email bạn nhập vào đó. Sau khi upload lên thành công thì bạn gởi url đó cho khách hàng hay tester là có thể cài ứng dụng vào được. Những file này được lưu trữ được 5 ngày, sau 5 ngày những file này sẽ bị xoá khỏi hệ thống.

- Trong bài của mình viết cách quản lý Crash Report thì Fabric cũng hỗ trợ cho bạn phân phối bản build đó cho những user khác mà bạn invite theo email của họ. Bạn cũng có thể sử dụng cách này nhưng mặt hạn chế của service này là bắt người nhận url phải đăng ký tài khoản Fabric thì mới có thể cài được ứng dụng. Điểm mạnh của Fabric là bạn có thể quản lý file cài 1 cách bảo mật hơn diawi và những file cài đó cũng được lưu trữ theo từng version của file IPA không giới hạn thời gian. Ngoài ra bạn có thể sử dụng Fabric để quản lý Crash Report và Analytics cũng rất hữu ích.

Tài liệu tham khảo:

- 25 tips từ Raywenderlick.

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.