gpt4 book ai didi

ios - 在核心数据中将托管对象上下文与调度队列一起使用

转载 作者:行者123 更新时间:2023-11-28 19:01:06 25 4
gpt4 key购买 nike

根据 apple 指南,为了在主线程上使用托管对象,它们需要通过仅限于主线程的上下文获取,没关系。下面是我的代码...

AppDelegate *del = [[UIApplication sharedApplication] delegate];

dispatch_queue_t queue1 = dispatch_queue_create("com.MyApp.AppTask",NULL);
dispatch_queue_t main = dispatch_get_main_queue();
dispatch_async(queue1, ^{
NSManagedObjectContext *workerContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
workerContext.persistentStoreCoordinator = del.persistentStoreCoordinator;
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
NSArray *managedObject = [workerContext executeFetchRequest:fetchRequest error:nil];

dispatch_async(main, ^{
NSLog(@"%@",managedObject);
Person *objperson = [managedObject objectAtIndex:0];
objperson.firstname = @“test”;
BOOL s = [workerContext save:nil];
if (s) {
NSLog(@"done");
}
});
});

现在,根据指南,我无法修改或保存由另一个线程创建的托管对象上下文。但是上面的代码工作正常并且修改和保存我的对象没有任何错误。因此,我能够修改由另一个线程获取的 MO,甚至我可以保存由另一个线程创建的 MOC。

请让我知道我这样做的方式是否错误,因为理想情况下我无法从主线程中保存后台线程的 MOC。

谢谢。

最佳答案

这是错误的,因为它的线程不安全 NOT 线程不可能跨线程与上下文和托管对象。

因此,您的简单示例可能在某些时候有效,但并非在所有情况下都有效。您迟早会因该模式而崩溃。

如果您希望在线程之间访问对象,您必须通过线程发送objectID

当您使用 NSPrivateQueueConcurrencyType 创建上下文时,它会创建并管理自己的队列。

你的例子表达得更好

AppDelegate *delegate = [[UIApplication sharedApplication] delegate];

NSManagedObjectContext *workerContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];

//set the parent NOT the persistent store coordinator
workerContext.parentContext = delegate.managedObjectContext;

[workerContext performBlock:^{

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
NSArray *results = [workerContext executeFetchRequest:fetchRequest error:nil];

if (results.count) {

Person *person = [results objectAtIndex:0];
person.firstname = @“test”;

BOOL success = [workerContext save:nil];
if (success) {
NSLog(@"done");
}

//you pass ObjectID's NOT managed objects across threads
NSManagedObjectID *objectID = [person objectID];

dispatch_async(dispatch_get_main_queue(), ^{

//update your UI here
Person *thePerson = (Person *)[[delegate managedObjectContext] objectWithID:objectID];
self.myUIElement.text = person.firstname;

});
}

}];

关于ios - 在核心数据中将托管对象上下文与调度队列一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25567800/

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