在后台线程中更新托管对象

时间:2015-11-01 19:56:35

标签: ios objective-c core-data

在我的应用中添加新项目时,它也会保存在服务器上。由于互联网上的延迟,此保存发生在后台的单独线程中。

但是,一旦插入完成,我想抓住服务器insert_id并将其保存在手持设备上的Core Data中。由于延迟,我认为这必须在后台线程中发生,并且保存的时间将是不可预测的。

从谷歌搜索,似乎正确的方法是在后台线程上创建一个新的托管对象上下文,并使用NSPredicate找到要更新的记录。

这是对的吗?

如果是这样,任何人都可以指向我的代码或教程,以显示如何做到这一点。

想找到全面搜索新项目的快捷方式,例如以下内容,因为我不确定找到它的最佳方式:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSManagedObjectContext *context = [IDModel sharedInstance].managedObjectContext; //IS THIS A NEW CONTEXT IN SECOND THREAD
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id IN %@", uids];//I don't know what id is...
fetchRequest.predicate = predicate;
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:context];
NSFetchedResultsController *fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];                
NSError *error = nil;

if (![fetchedResultsController performFetch:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}

NSArray *fetchedObjects = fetchedResultsController.fetchedObjects;
NSInteger resultCount = [fetchedObjects count];

if (resultCount == 0) {
    NSLog(@"THERE ARE NO ITEMS WITH IDS IN CORE DATA STORE");
    return [NSMutableDictionary dictionary];//nothing in the Core Data store
} else {
    Items *item;

感谢任何建议。

1 个答案:

答案 0 :(得分:0)

我不会在后台线程中执行Core Data保存部分,这只是一个PHP / MySQL插入ID,可能大约10个字节,不会超过50ms。

但是为了从互联网上发布或获取数据我会说你需要在后台线程的异步请求中这样做,当你收到响应时,立即将它保存到主线程上的Core Data。

// show loading indicators when you are fetching data
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
    // hide loading indicators when you received a response
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];

    if (connectionError) {
        // Handle error
    } else {
        NSDictionary *jsonResults = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
        NSLog(@"jsonResults: %@", jsonResults);

        // reload views or insert to core data on main thread
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.myCollectionView reloadData]; // example
            [self insertDataIntoDatabase:jsonResults]; // example
        });
    }
}];

如果您要在应用程序中使用它,我还建议您查看核心数据的共享实例。