gpt4 book ai didi

ios - 设置 NSManagedObject 属性会停止应用程序...有时

转载 作者:行者123 更新时间:2023-11-29 02:29:20 25 4
gpt4 key购买 nike

我有一个应用程序,我在其中循环一些 json 并在后台设置一些对象

dispatch_async(CD_QUEUE(), ^{    

NSEntityDescription *questionEntity = [NSEntityDescription entityForName:QUESTION inManagedObjectContext:self.backgroundContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
[fetchRequest setEntity:questionEntity];


for (NSInteger i = 0; i < [questionsArray count]; i++) {

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"uid == %@", questionUID];
[fetchRequest setPredicate:predicate];

NSError *error = nil
NSArray *array = [context executeFetchRequest:fetchRequest error:&error];
MYQuestion *question = nil;

NSLog(@"Error %@",[error localizedDescription]);

if ([array count] == 0)
{
NSLog(@"NIL question");
question = [self newQuestionInContext:context];
question.uid = questionUID;
}
else
question = [array objectAtIndex:0];

if ([questionDataDictionary objectForKey:@"question"] != [NSNull null] && [questionDataDictionary objectForKey:@"question"] != nil)
{
NSLog(@"set question %@",question);
NSLog(@"UID: %@",question.uid);
question.body = [questionDataDictionary objectForKey:@"question"];
NSLog(@"set question finished");
}

and so on....

有时,每次都会为同一问题设置 Question.body,但有时它会毫无问题地完成。问题不是 nil,正如你所看到的, json 对象也不是 nil .. 那么这里的问题是什么?我的应用程序此时陷入困境,我不知道如何解决此问题(如果发生)

日志....

Error (null)

set question < MYQuestion: 0x17515e20> (entity: MYQuestion; id: 0x17641990 <x-coredata://103ACE29-9CF0-4216-BAF8-A30A04C22B0D/MYQuestion/p12493> ; data: < fault >)

因此,当我尝试访问该对象上的任何属性时,它会出错...提取时没有错误,但该对象有时会出错??我不明白。

最佳答案

这是一个并发问题。一般来说,NSManagedObjects 不是线程安全的。这意味着您只能从创建它们的 NSManagedObjectContext 的线程或在此上下文的私有(private)队列中读取和写入它们的属性。

您正在访问 CD_QUEUE 中的托管对象,因此由 Grand Central Dispatch 决定在哪个线程中执行此代码。因此,这些托管对象有可能从“错误的”线程访问——而不是它们的 context “所在”的线程。

代替 dispatch_async,在您的 context 上使用 performBlockperformBlockAndWait 方法之一。它们的目的是确保以安全的方式访问托管对象:

[context performBlock:^{
//do what you did in dispatch_async block
];

如果您想了解更多有关 Core Data 和并发的信息,请阅读详细的(虽然有点过时)Apple 的 Core Data Concurrency GuideCommon Background Practices by objc.io .

对于问题的第二部分:对象是 fault 并不意味着在获取请求期间有错误。这意味着对象的属性尚未从持久存储(如 SQLite 数据库)加载到内存中。更多信息:Faulting and uniquing

关于ios - 设置 NSManagedObject 属性会停止应用程序...有时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27108557/

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