gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:28:46 25 4
gpt4 key购买 nike

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

但是,插入完成后,我想获取服务器insert_id并将其用于该项目保存在掌上电脑的Core Data中。由于延迟,我认为这也必须在后台线程中发生,并且保存时间将是不可预测的。

从Googling看来,正确的方法是在后台线程上创建新的托管对象上下文,并使用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;

将不胜感激任何建议。

最佳答案

我不会在后台线程中保存核心数据,这只是一个PHP / MySQL插入ID,它可能约为10个字节,并且不会超过50ms。

但是对于从Internet发布或获取数据,我会说您需要在后台线程上的异步请求中执行此操作,并且在收到响应后,立即将其保存到主线程上的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
});
}
}];

如果您将在整个应用程序中大量使用共享实例,我还建议您查看共享实例。

关于ios - 在后台线程中更新托管对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33466531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com