【发布时间】:2017-06-23 10:09:21
【问题描述】:
由于某些原因来修复一些崩溃,我需要在 GCD 中编写/调用以下方法,但由于它具有返回类型 NSArray,此处调度块不允许在调度块中编写此方法。
由于未捕获的异常“NSGenericException”,实际崩溃是正在终止应用程序,原因:“*** Collection <__nscfset:> 在枚举时发生了变异。”
有人可以帮我解决这个问题吗
-(NSArray*)getManagedObjectsArrayForEntity:(NSString*)entityName
sortByFields:(NSArray*)sortByFields
predicate:(NSPredicate*)predicate
ascending:(BOOL)ascending {
// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];
[fetchRequest setFetchLimit:-1];
// Set the sort descriptor
if (sortByFields) {
NSMutableArray *sortDescriptors = [NSMutableArray array];
for (NSString *sortByField in sortByFields) {
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sortByField ascending:ascending];
[sortDescriptors addObject:sortDescriptor];
[sortDescriptor release];
}
[fetchRequest setSortDescriptors:sortDescriptors];
}
if (predicate) {
[fetchRequest setPredicate:predicate];
//DDLogVerbose(@"Predicate: %@", [predicate description]);
}
NSLog(@"HAS CHANGES %d",self.managedObjectContext.hasChanges);
NSError *error;
//===
return [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
}
【问题讨论】:
-
如果你想异步调度块,你需要提供一个完成处理块,以便在操作完成后调用。
-
你能详细说明@Paulw11
-
您如何确定异步执行此方法将在枚举崩溃时解决您的变异问题?一般来说,引入并发不太可能有助于解决这种崩溃,实际上它可能会使其更难解决。为什么你认为这种方法是导致你崩溃的原因?让人们能够帮助您编辑您的问题以包括这些答案以及您认为可能相关的任何其他内容。 HTH
标签: ios objective-c core-data grand-central-dispatch nsmanagedobjectcontext