gpt4 book ai didi

ios - 核心数据崩溃:集合在枚举时发生了变异

转载 作者:行者123 更新时间:2023-12-01 19:55:26 25 4
gpt4 key购买 nike

尝试执行抓取操作时,我的应用似乎崩溃了。我正在使用魔法唱片。错误消息是:

枚举时对集合<__ NSCFSet:0x17005a1f0>进行了突变。

对我来说,这表明我们在执行提取操作时正在更改上下文中的对象,但是我对此并不陌生,所以我可能是错的。

这是它指向的代码:

- (void) buildAndFetchFRCsInContext:(NSManagedObjectContext*)context{

[context performBlock:^{
__unused NSDate* start = [NSDate date];

self.contactsFRC = [self buildFetchResultsControllerForClass:[Contact class] sortedBy:@"id" withPredicate:nil inContext:context];
self.callsFRC = [self buildFetchResultsControllerForClass:[Call class] sortedBy:@"id" withPredicate:nil inContext:context];
self.newsItemsFRC = [self buildFetchResultsControllerForClass:[NewsItem class] sortedBy:@"id" withPredicate:nil inContext:context];

NSError* error;

// Peform the fetches
[self.contactsFRC performFetch:&error];
[self.callsFRC performFetch:&error];
[self.newsItemsFRC performFetch:&error]; //Crash points to this line
NSLog(@"Spent [%@s] performing fetchs for counts!", @(fabs([start timeIntervalSinceNow])));

[self calculateAndBroadcastCounts];
}];
}

传入的上下文是:
- (instancetype) initWithUserSession:(BPDUserSession*)userSession{
self = [super init];
...
self.context = [NSManagedObjectContext MR_context];
[self buildAndFetchFRCsInContext:self.context];
...
}

我认为该类正在主线程中初始化,但是performBlock将块添加到队列中,然后从其他线程执行。但是我不认为这是真的,因为performBlock的目的是在另一个线程上执行该块。

根据我发布的内容,谁能说出问题所在?

更新:

我尝试将 buildFetchResultsController调用移至perform块之外:
- (void) buildAndFetchFRCsInContext:(NSManagedObjectContext*)context{
self.contactsFRC = [self buildFetchResultsControllerForClass:[Contact class] sortedBy:@"id" withPredicate:nil inContext:context];
self.callsFRC = [self buildFetchResultsControllerForClass:[Call class] sortedBy:@"id" withPredicate:nil inContext:context];
self.newsItemsFRC = [self buildFetchResultsControllerForClass:[NewsItem class] sortedBy:@"id" withPredicate:nil inContext:context];

NSMutableArray *list = [[NSMutableArray alloc] initWithCapacity:100];
for (int i = 0; i < 100; i++) {
list[i] = [self buildFetchResultsControllerForClass:[NewsItem class] sortedBy:@"id" withPredicate:nil inContext:context];
}

[context performBlock:^{
__unused NSDate* start = [NSDate date];

NSError* error;

// Peform the fetches
[self.contactsFRC performFetch:&error];
[self.callsFRC performFetch:&error];
[self.newsItemsFRC performFetch:&error];

for (int i = 0; i < list.count; i++) {
[list[i] performFetch:&error]; // Generally error is thrown on i = 5 ~> 10
}

NSLog(@"Spent [%@s] performing fetchs for counts!", @(fabs([start timeIntervalSinceNow])));

[self calculateAndBroadcastCounts];
}];
}

但这仍然失败。我可以使用上面显示的循环重现故障。我还尝试通过 NSPrivateQueueConcurrencyType在实际的performBlock闭包中创建一个新的上下文以使用,但这同样不起作用。

注意:我使用的是MagicalRecords,因此对于不熟悉的人来说, [NSManagedObjectContext MR_context];等效于从以下位置返回的上下文:
NSManagedObjectContext *context = [[self alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; // Here self is NSManagedObjectContext
[context setParentContext:parentContext];
[context MR_obtainPermanentIDsBeforeSaving];
return context;

最佳答案

我的问题是我正在上下文中执行保存,并且该保存存在并发问题,我试图从不是主线程的线程中保存在主线程上创建的对象。将该代码移至主线程可修复崩溃。

关于ios - 核心数据崩溃:集合在枚举时发生了变异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42963726/

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