Tôi hơi bị mắc kẹt với điều này ... bất kỳ trợ giúp nào đều được đánh giá cao. Tôi đã dành rất nhiều thời gian để sửa lỗi này.Hiệu suất kém UITableViewCell với AutoLayout
Tôi có UITableView
với nguồn dữ liệu được cung cấp bởi NSFetchedResultsController
. Trong một bộ điều khiển xem riêng biệt, tôi chèn bản ghi mới vào CoreData bằng cách sử dụng [NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:]
, lưu ngữ cảnh đối tượng được quản lý và loại bỏ bộ điều khiển đó. Công cụ rất chuẩn.
Những thay đổi trong bối cảnh đối tượng được quản lý sau đó được nhận bởi NSFetchedResultsController
:
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
[self.tableView beginUpdates];
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
[self.tableView endUpdates];
}
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
switch (type) {
case NSFetchedResultsChangeInsert:
[self.tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationNone];
break;
case NSFetchedResultsChangeDelete:
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
break;
case NSFetchedResultsChangeUpdate:
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
break;
case NSFetchedResultsChangeMove:
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationNone];
break;
}
}
Và đây là nơi mà các vấn đề xuất hiện - phải mất quá nhiều thời gian (khoảng 3-4 giây trên iPhone 4) để làm điều đó. Và có vẻ như thời gian được dành để tính toán bố cục cho các ô.
Tôi đã xóa mọi thứ khỏi ô (bao gồm cả lớp con tùy chỉnh) và để nó chỉ với UILabel
, nhưng không có gì thay đổi. Sau đó, tôi đã thay đổi phong cách của ô thành Cơ bản (hoặc bất kỳ thứ gì ngoại trừ Tùy chỉnh) và sự cố đã biến mất - các ô mới được thêm ngay lập tức.
Tôi đã kiểm tra gấp đôi và NSFetchedResultsControllerDelegate
gọi lại chỉ được gọi một lần. Nếu tôi bỏ qua chúng và làm [UITableView reloadSections:withRowAnimation:]
, không có gì thay đổi - nó vẫn còn rất chậm.
Dường như đối với tôi, Bố cục tự động bị vô hiệu hóa đối với kiểu ô mặc định, điều này khiến chúng rất nhanh. Nhưng nếu đó là trường hợp - tại sao mọi thứ tải nhanh chóng khi tôi đẩy UITableViewController
?
Đây là dấu vết cuộc gọi cho vấn đề đó:
Vậy câu hỏi được - những gì đang xảy ra ở đây? Tại sao các tế bào được kết xuất chậm?
UPDATE 1
tôi đã xây dựng một ứng dụng demo rất đơn giản để minh họa vấn đề tôi gặp phải. đây là nguồn - https://github.com/antstorm/UITableViewCellPerformanceProblem
Hãy thử thêm ít nhất một màn hình ô để cảm nhận vấn đề về hiệu suất.
Cũng lưu ý rằng việc thêm hàng trực tiếp (nút "Chèn ngay bây giờ!") Không gây ra bất kỳ sự chậm trễ nào.
Chỉ cần xác nhận - bạn đang chỉ định các ô tùy chỉnh của bạn một số nhận dạng duy nhất và khử chúng thay vì tạo lại, đúng không? – James
và quy tắc bố cục tự động nào được chỉ định trên ô? – Wain
Có, tôi đang chỉ định một số nhận dạng duy nhất và các ô khử de sử dụng '[UITableView dequeueReusableCellWithIdentifier: forIndexPath:]'. –