从后台线程更新表视图?

时间:2013-06-19 06:47:40

标签: objective-c multithreading core-data

我正在尝试从Core数据更新表格视图,如下所示:

    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);

在块I中:

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

但在:

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

我的对象:

 MyObj *obj = _tableViewData[indexPath.row];

使用nil字段。所以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 个答案:

答案 0 :(得分:1)

您不能在这样的线程之间传递托管对象。如果要在后台线程上运行搜索,则应将托管对象ID传递回表视图,并使用id从主线程上下文访问托管对象。执行后台提取时,您可以配置提取以返回ID而不是完整对象。