2013-08-29 28 views
5

Tôi có chức năng kết nối với internet và sau đó làm mới các ô trong bảng.Tải lại UITableViewData chậm

chức năng của tôi là:

- (void) updateMethod 
{ 

    NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
    queue.name = @"Data request queue"; 

    [queue addOperationWithBlock:^{ 

     //neither of these delay the responsiveness of the table 
     [columnArrayBackground removeAllObjects]; 
     [self getColumnDataBackground]; 

     [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 

      for (int i=0; i < 6; i++) { 
       columnArray[i] = columnArrayBackground[i]; 
      }; 

      //THIS ONE LINE CAUSES DELAYS 
      [homeTable reloadData]; 


     }]; 
    }]; 
} 

Tất cả mọi thứ là siêu nhanh chóng TRỪ cho [homeTable reloadData]. Khi tôi nhận xét điều đó, tôi có phản ứng nhanh. Khi tôi bỏ ghi chú, phản ứng di động của tôi bị trễ đôi khi vài giây!

Tải lại khác của tôiData gọi không làm chậm ứng dụng của tôi. Tôi có đang triển khai NSOperationQueue đúng không?

+0

bạn có thể thử tải lại chỉ các ô hiển thị không? Nếu nguồn dữ liệu của bạn đã được cập nhật trước khi người dùng cuộn xuống, thì nó có thể nhanh hơn tức là một cái gì đó như [homeTable reloadRowsAtIndexPaths: [homeTable indexPathsForVisibleRows]] – Max

+0

Hiển thị các phương thức ủy nhiệm xem bảng. 'GetColumnDataBackground' làm gì? Làm thế nào để bạn biết nó đang gây ra một 'chậm trễ'? – Wain

Trả lời

6

Xóa hàng đợi khỏi phương thức cập nhật của bạn và chỉ để lại những gì cập nhật bảng. Theo hành động làm mới bảng của bạn, hãy thêm mã này. Trường hợp updateMethod là mã cập nhật bảng. Chỉ khi bạn quay trở lại luồng chính thì bạn mới tải lại dữ liệu. Hi vọng điêu nay co ich!

//perform on new thread to avoid the UI from freezing 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), 
       ^{ 
        //background thread code 
        [self performSelector:@selector(updatemethod:) withObject:nil]; 
        dispatch_async(dispatch_get_main_queue(), 
            ^{ //back on main thread 
             [self.tableView reloadData]; 
            });}); 
+0

Mã này có thể sẽ gây ra một cuộc đua, khi chủ đề nền và chủ đề chính đồng thời truy cập và sửa đổi dữ liệu được hiển thị. – CouchDeveloper

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