gpt4 book ai didi

ios - 使用 NSPrivateQueueConcurrencyType 上下文循环将数据保存到核心数据会意外地离开循环

转载 作者:行者123 更新时间:2023-11-28 22:30:49 24 4
gpt4 key购买 nike

我在 connectionDidFinishLoading:connection NSURLConnection 异步委托(delegate)方法中使用此代码,同时下载大量数据。

- (void)saveCompatibilities:(NSArray *)objects {

//setup tempMoc
UIApplication *app = [UIApplication sharedApplication];
AppDelegate *appDelegate = (AppDelegate *)app.delegate;
NSManagedObjectContext *moc = appDelegate.managedObjectContext;
NSPersistentStoreCoordinator *storeCoordinator = moc.persistentStoreCoordinator;
NSManagedObjectContext *tempMoc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
tempMoc.persistentStoreCoordinator = storeCoordinator;

NSString *entityName = NSStringFromClass([Compatibility class]);
for (NSDictionary *newObjectDict in objects) {
[tempMoc performBlock:^{
Compatibility *object = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:tempMoc];
object.prod1 = newObjectDict[@"prod1"];
object.prod2 = newObjectDict[@"prod2"];
object.prod3 = newObjectDict[@"prod3"];
object.region = newObjectDict[@"region"];
object.result = newObjectDict[@"result"];
NSLog(@"%@", object);
}];
}

//do some other stuff here ...

tempMoc = nil;
}

此代码运行正常并保存了一些 对象,但在中间崩溃并出现此错误:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name 'Compatibility''

我设置了断点,了解到最后一行 tempMoc = nil; 在保存一些 对象后被命中,但没有离开函数。它只是回到循环中,因为 tempMoc 现在是 nil,所以错误发生了。

为什么它没有完成对对象数组的循环?它确实离开了循环,为什么它不把所有的功能都放在一起呢?我假设这是由于多线程,我是新手。

最佳答案

是因为多线程。 performBlock 将在稍后的某个时间在不同的线程上调用,可能是在方法完成之后。这意味着在 tempMoc 设置为 nil 之后。我认为你应该像这样将 for 循环放在 peformBlock 中

        [tempMoc performBlock:^{
for (NSDictionary *newObjectDict in objects) {
Compatibility *object = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:tempMoc];
object.prod1 = newObjectDict[@"prod1"];
object.prod2 = newObjectDict[@"prod2"];
object.prod3 = newObjectDict[@"prod3"];
object.region = newObjectDict[@"region"];
object.result = newObjectDict[@"result"];
NSLog(@"%@", object);
}
}];

我认为你最后不需要将 tempMoc 设置为 nil。

关于ios - 使用 NSPrivateQueueConcurrencyType 上下文循环将数据保存到核心数据会意外地离开循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17508241/

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