2013-06-19 132 views
0

我想更新從核心數據這樣的表視圖:從後臺線程更新表視圖?

dispatch_queue_t request_queue = dispatch_queue_create("com.myqueue.qu", NULL); 
    dispatch_async(request_queue, ^{ 

     NSManagedObjectContext *parent = [[CoreDataManager instance] managedObjectContext]; 
     NSManagedObjectContext *searchContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:parent.concurrencyType]; 
     [searchContext setPersistentStoreCoordinator:[[CoreDataManager instance] persistentStoreCoordinator]]; 

     NSArray * array = ...// receive array from CoreData, just select, there is no changes 

     if (array.count > 0) { 

      dispatch_async(dispatch_get_main_queue(), ^{ 
       block(array); 
      }); 
     } 
     else { 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       block(nil); 
      }); 
     } 
    }); 
    dispatch_release(request_queue); 

在塊我做的:

_tableViewData = [array mutableCopy]; 
[self.tableView reloadData]; 

但在:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

我的OBJ:

MyObj *obj = _tableViewData[indexPath.row]; 

無字段。所以obj是空的。

編輯:

我試過,而無需創建「searchContext」進行搜索,使用parentContext和更新的tableView確定,是不是正確的方式?

dispatch_queue_t request_queue = dispatch_queue_create("com.myqueue.qu", NULL); 
    dispatch_async(request_queue, ^{ 

     NSManagedObjectContext *parent = [[CoreDataManager instance] managedObjectContext]; 

     NSArray * array = ...// receive array from CoreData, using parent as search context 

...

回答

1

你不能將管理這樣的線程之間的對象。如果要在後臺線程上運行搜索,則應將託管對象ID傳遞迴表視圖,並使用ID從主線程上下文訪問託管對象。當您執行後臺提取時,您可以將提取配置爲返回id而不是完整對象。

+0

感謝您的回答,如果我要在主要環境中進行搜索,是否正確?我的意思是:NSManagedObjectContext * parent = [[CoreDataManager實例] managedObjectContext];不創建searchContext。我試過了,它更新了tableview。 –

+0

只有在主線程上運行搜索。每個線程應該使用自己的上下文。你只是通過使用主線程上下文而作弊,因爲你不編輯任何東西,但它不被推薦或完全可靠。 – Wain