Wednesday, November 27, 2013

Cải thiện lập trình IOS
1) Sử dụng ARC để quản lý bộ nhớ
2) Sử dụng reuseIdentifier thích hợp
Use a reuseIdentifier Where Appropriate.
Use a reuseIdentifier Where Appropriate.
Lỗi cơ bản mà các lập trình viên thường gặp là việc sử dụng không đúng reuseidentifier cho UITableViewCells,  UICollectionViewCells,  UITableViewHeaderFooterViews.
Ví dụ về sử dụng ReuseIdentifier:
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

3) Thiết lập thuộc tính Opaque khi có thể
Set Views as Opaque When Possible.
Set Views as Opaque When Possible.
Thiết lập thuộc tính opaque cho view nếu có thể. (Nếu ảnh ko transparent)
Điều này sẽ giúp hệ thống generate view 1 cách tối ưu nhát.





Theo tài liệu của Apple: 
This property provides a hint to the drawing system as to how it should treat the view. If set to YES, the drawing system treats the view as fully opaque, which allows the drawing system to optimize some drawing operations and improve performance. If set to NO, the drawing system composites the view normally with other content. The default value of this property is YES.
4) Tránh dùng các file XIB lớn
Avoid Fat XIBs.
Avoid Fat XIBs.
Trong iOS5, Storyboard đã được giới thiệu để thay thế cho các file XIB. Tuy nhiên các file XIB vẫn được sử dụng rất thường xuyên.
Khi làm việc với các file XIB, nên để file xib đó đơn giản nhất có thể, cố gắng tạo 1 file xib 1 view controller, nếu cần có thể chia view controller ra nhiều file xib với các view con để file xib không phức tạp.
Lưu ý rằng khi bạn tải XIB vào bộ nhớ, toàn bộ nội dung của file xib được tải vào bộ nhớ, bao gồm cả ảnh. Nếu có 1 số view chúng ta đưa vào xib mà không dùng ngay, chúng ta sẽ lãng phí 1 phần bộ nhớ. 
Với storyboard, các viewcontroller chỉ được khởi tạo khi thực sự cần nên việc File Storyboard không ảnh hưởng đến bộ nhớ.

Khi sử dụng Storyboard với các app lớn thì nên chia ra nhiều storyboard để giảm thiểu bộ nhớ.
Các bạn có thể tham khảo cách dùng storyboard ở đây:
Beginning Storyboards in iOS 5 Part 1 và Part 2.

5) Đừng Khoá main thread
Don't Block the Main Thread.
Don’t Block the Main Thread.
Có 1 số nguyên tắc căn bản mà lập trình viên nên tuân thủ:
- Không bao giờ thực hiện các thao tác "nặng" ở main thread. Bởi UIKit (Lớp sinh giao diện) thực hiện tất cả các nhiệm vụ của mình ở Main Thread (Như vẽ, quản lý việc touch vào màn hình, respond Input).
Khi thực hiện các task ở main thread có thể dẫn đến trường hợp đoạn code của bạn khoá thread này, khi sử dụng app cảm giác app bị "đơ", "giật".

Các trường hợp nên dùng main thread là khi app của bạn thực hiện các toán tử Input/Output (VD: thực hiện các thao tác đọc hoặc ghi dữ liệu từ bên ngoài như trong database hoặc network.

Bạn có thể thực hiện request không đồng bộ cho  NSURLConnection:
+ (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler
Hoặc sử dụng các thư viện khác như AFNetworking
Nếu sử dụng các toán tử tốn nhiều thời gian thực hiện, hãy sử dụng Grand Central Dispatch, hoặc NSOperations, NSOperationQueues.
Ví dụ Về GCD:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // switch to a background thread and perform your expensive operation
 
    dispatch_async(dispatch_get_main_queue(), ^{
        // switch back to the main thread to update your UI
 
    });
});
Bạn có thể thấy, trong dispatch_async xuất hiện 1 đoạn  dispatch_async(dispatch_get_main_queue(), ^{}); nữa.

Đó là vì tất cả các đoạn code liên quan đến UIKit cần đươcj thực hiện ở Main Thread.

 Bạn nên tìm hiểu về NSOperation và GCD

6) Đặt kích thước ảnh chính xác
Size Images to Image Views.
Size Images to Image Views.
Nếu bạn dùng hiển thị ảnh UIImageView trong file xib, hãy đặt kích thước UIImageView chính xác với kích thước thật của ảnh. Điều này giúp cho trong quá trình chạy, app không phải chạy thêm 1 đoạn code scale, resize ảnh nữa.
Nếu ảnh được download từ 1 service bên ngoài, hoặc bạn không thể kiểm soát được kích thước ảnh thì có thể tiến hành scale và resize ảnh sau khi download, tốt nhất là nên thực hiện ở background thread.

7) Chọn đúng Collection 
Choose the Correct Collection.
Choose the Correct Collection.
Collection có thể được kết nối đến nhiều kiểu: Arrays, Dictionaries, Sets. Nên sử dụng các trường hợp này một cách hợp lý:
- Arrays: Mảng được sắp xếp theo thứ tự, có thể truy xuất nhanh theo index, truy xuất chậm khi tìm kiếm giá trị, việc insert, delete chậm.
- Dictionary: Lưu theo key/value. Có thể truy xuất nhanh theo key.
- Sets: Là 1 tập hợp các giá trị, truy xuất nhanh thông qua giá trị, insert, delete nhanh.
8) Enable GZIP Compression
Enable GZIP compression.
Enable GZIP compression.
Hiện tại có 1 số lượng lớn các app lưu trữ dữ liệu thông qua Remote Server hoặc qua các api. Nói cách khác, chúng ta phát triển app sử dụng download dữ liệu dưới dạng XML, JSON, HTML, hoặc 1 số text format khác.
Vấn đề là: Điều kiện network không thể reply hết các request từ device. User có thể sử dụng mạng kết nối chậm, 3G... Trong bất kỳ trường hợp nào, cần hạn chế thời gian chờ của người dùng.
Có thể giảm kích thước của file và tăng tốc độ download bằng cách enable GZip Compression trên cả server và client. Điều này rất hữu ích cho các dữ liệu dạng text, có khả năng nén lớn.
IOS cũng đã hỗ trợ GZip compression nếu bạn sử dụng NSURLConnection thì GZip compression đã được enable theo mặc định.

No comments:

Post a Comment