2013-08-28 42 views
7

Khi sử dụng - (void)beginUpdates- (void)endUpdates trên UITableView, bạn có phải thực hiện thay đổi đối với nguồn dữ liệu bên trong cuộc gọi không?UITableView bắt đầu/kết thúc cập nhật

tức

Nếu tôi có một NSMutableArray gọi dataSource lái xe của tôi tableView tôi có thể làm điều này ...

// edit the actual data first 
[dataSource addObject:@"Blah"]; 

// now update the table 
[self.tableView beginUpdates]; 

[self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:dataSource.count - 1 inSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; 

[self.tableView endUpdates]; 

Hoặc là nó cần thiết để làm ...

[self.tableView beginUpdates]; 

[dataSource addObject:@"Blah"]; 

[self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:dataSource.count - 1 inSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; 

[self.tableView endUpdates]; 

Just hỏi vì tôi có một vài nơi mà tôi đang cập nhật và tôi có khả năng có thể lấy mã chung ra một hàm.

Nhưng chỉ khi tôi có thể cập nhật bên ngoài cuộc gọi cập nhật.

Trả lời

10

Thường là một ý tưởng tốt để cập nhật nguồn dữ liệu ở giữa tableView beginUpdates/endUpdates. Sau khi endUpate được gọi, hệ điều hành sẽ kích hoạt các cuộc gọi dataSource để nhận các phần và số lượng hàng. Nếu tại thời điểm đó, nguồn dữ liệu chưa được cập nhật, sau đó bạn có thể gặp sự cố không đồng nhất của tableView.

Nó có thể hoạt động trong một số trường hợp để cập nhật nguồn dữ liệu trước khi tableView beginUpdates/endUpdates gọi, tuy nhiên bạn phải đảm bảo rằng bạn đang cập nhật nguồn dữ liệu trong cùng một chuỗi và trên cùng một vòng lặp chạy. Vì các bản cập nhật tableView phải được thực hiện trên luồng chính, điều đó có nghĩa là bạn phải thực hiện cập nhật nguồn dữ liệu của mình trên luồng chính.

Nếu bạn cập nhật nguồn dữ liệu và không ngay lập tức thực hiện cập nhật tableView (và bạn làm điều gì đó như xoay màn hình), thì bạn có thể gặp sự cố không đồng nhất của tableView.

+0

nơi tôi nên thêm các dòng mã này trong chế độ xem? hoặc cellforrowatindexpath? hoặc bất kỳ phương pháp nào khác? –

+0

Điều này rất quan trọng "bạn phải đảm bảo rằng bạn đang cập nhật nguồn dữ liệu trong cùng một chuỗi" – Siyavash

+0

@Siyavash làm cách nào tôi có thể làm điều đó? tôi có vài đại biểu cập nhật nguồn dữ liệu, cách đảm bảo rằng im cập nhật chúng trong cùng một chuỗi. – titan

2

Tôi luôn sử dụng phương pháp tiếp cận thứ nhất và không gây ra sự cố nào. chỉ cần đảm bảo rằng sau khi thay đổi nguồn dữ liệu, hãy cập nhật ngay lập tức bảng của bạn.

2

Không có quy tắc nào cho biết cập nhật nguồn dữ liệu phải nằm trong các cuộc gọi bắt đầu/kết thúc. Đảm bảo rằng sau khi cập nhật nguồn dữ liệu bạn chèn/xóa các hàng theo yêu cầu để không làm hỏng mọi thứ trong thời gian dài.

3

Tôi cũng bắt gặp điều này và không biết cách tốt nhất là gì. Tuy nhiên, tài liệu chính thức, Table View Programming Guide, không cung cấp một số thông tin liên quan đến điều này. Trong "Một thí dụ về batched chèn và xóa Operations", nó được đề cập:

Để chèn và xóa một nhóm các nhà hàng và các bộ phận trong một cái nhìn bảng, đầu tiên chuẩn bị mảng (hoặc mảng) mà là những nguồn dữ liệu cho các phần và hàng. Sau khi các hàng và phần được xóa và chèn, các hàng và phần kết quả được điền từ kho dữ liệu này.

Hy vọng điều này sẽ hữu ích. Và tôi mong muốn tìm hiểu điều này rõ ràng hơn nếu ai đó có thể giải thích rõ hơn.

Các vấn đề liên quan