ios – 核心数据和GCD:将正确的托管对象上下文传递给自定义NSManagedObjects

ios – 核心数据和GCD:将正确的托管对象上下文传递给自定义NSManagedObjects,第1张

概述我得到运行时错误,这似乎是由于我的错误实现GCD与我的自定义NSManagedObjects相结合. 嵌套在GCD调用中,我使用自定义NSManagedObjects(似乎)有自己的托管对象上下文(= self.managedObjectContext). 我通过使用UIManagedDocument提供的托管对象上下文在app委托中创建托管对象上下文:self.managedDocument.m 我得到运行时错误,这似乎是由于我的错误实现GCD与我的自定义NSManagedobjects相结合.

嵌套在GCD调用中,我使用自定义NSManagedobjects(似乎)有自己的托管对象上下文(= self.managedobjectContext).

我通过使用UIManageddocument提供的托管对象上下文在app委托中创建托管对象上下文:self.manageddocument.managedobjectContext.

我不明白如何将正确的托管对象上下文传递给我的自定义NSManagedobjects.我如何更改代码以使用正确的托管对象上下文?

这是我的主要方法(在​​视图控制器内):

dispatch_queue_t queue;queue = dispatch_queue_create("queue",NulL);dispatch_async(queue,^{// ...NSDecimalNumber *value = [reportedPeriod    valueForCoa:figure.code    convertedTo:self.currencySymbol];// ...});}

在这个main方法中,我没有任何对托管对象上下文的引用,我只调用valueForCoa:convertedTo :(编码如下):

- (NSDecimalNumber*)valueForCoa:(Nsstring*)coaStrconvertedTo:(Nsstring*)targetCurrencyStr {// ...CoaMap *coa = [CoaMap coaItemForString:coaStr   inManagedobjectContext:self.managedobjectContext];// ...}

valueForCoa是我的自定义子类NSManagedobject ReportedPeriod中的一个方法,并使用其(默认)托管对象上下文self.managedobjectContext.

然后,在执行获取请求时,应用程序通常会在以下方法中在自定义子类NSManagedobject CoaMap中崩溃:

+ (CoaMaP*)coaItemForString:(Nsstring*)coaStr inManagedobjectContext:(NSManagedobjectContext*)context {NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityname:NsstringFromClass([self class])];nspredicate *predicate =    [nspredicate predicateWithFormat:@"coa == %@",coaStr];   request.predicate = predicate;// ** The runtime error occurs in the following line **NSArray *results = [context executeFetchRequest:request error:nil];// ...}

错误消息是:由于未捕获的异常’NSGenericException’而终止应用程序,原因:’*** Collection< __ NSCFSet:0x9a8a4a0>在被列举时被突变.

您能否帮我解决这个问题,并就如何改进我的代码以传递正确的托管对象上下文(或如何确保在所有方法中使用正确的上下文)给出一些建议?

非常感谢你!

解决方法 该错误通常涉及跨不同线程或队列使用托管对象错误上下文.您在主队列上创建了MOC,但是您在后台队列中使用它而不考虑该事实.在后台队列上使用MOC并没有错,但您需要了解这一点并做好准备.

你没有说你是如何创建MOC的.我建议你应该这样做:

NSManagedobjectContext *context = [[NSManagedobjectContext alloc]    initWithConcurrencyType: NSMainQueueConcurrencyType];

使用主队列并发,您可以在主线程上正常使用它.当您在调度队列中时,请执行以下 *** 作:

[context performBlockAnDWait:^{    NSFetchRequest *request = [NSFetchRequest         fetchRequestWithEntityname:NsstringFromClass([self class])];    nspredicate *predicate =        [nspredicate predicateWithFormat:@"coa == %@",coaStr];    request.predicate = predicate;    NSArray *results = [context executeFetchRequest:request error:nil];    // ...}];

这将确保即使您在后台队列中,MOC的工作也会在主线程上进行. (从技术上讲,它实际意味着MOC在后台的工作将与它在主队列上的工作正确同步,但结果是相同的:这是安全的方法).

类似的方法是使用nsprivateQueueConcurrencyType.如果你这样做,你可以在任何地方为MOC使用performBlock或performBlockAnDWait,而不仅仅是在后台线程上.

总结

以上是内存溢出为你收集整理的ios – 核心数据和GCD:将正确的托管对象上下文传递给自定义NSManagedObjects全部内容,希望文章能够帮你解决ios – 核心数据和GCD:将正确的托管对象上下文传递给自定义NSManagedObjects所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1017532.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存