对于这个核心数据错误,我真的很糟糕。
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'statement is still active'
我的应用程序和代码都可以正常工作,除了偶尔快速调用请求时。当我试图破坏应用程序时会发生这种情况。从一个屏幕转到下一个屏幕,下载数据并执行获取请求。
我知道这与线程和核心数据有关。
我从后台线程调用这段代码,它有自己的托管对象上下文。
+ (AN_User *)updateWithRecord:(NSDictionary *)record moc:(NSManagedObjectContext *)moc{
NSNumber *userID = nil;
NSString *username = nil;
if([record objectForKey:@"user_id"]){
userID = [NSNumber numberWithInt:[[record objectForKey:@"user_id"] intValue]];
}else if([record objectForKey:@"id_member"]){
userID = [NSNumber numberWithInt:[[record objectForKey:@"id_member"] intValue]];
}
if([record objectForKey:@"username"]){
username = [NSString stringWithFormat:@"%@", [record objectForKey:@"username"]];
}else if([record objectForKey:@"member_name"]){
username = [NSString stringWithFormat:@"%@", [record objectForKey:@"member_name"]];
}
if(!userID||!username){
return nil;
}
__block AN_User *user = nil;
[moc performBlockAndWait:^{
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"AN_User" inManagedObjectContext:moc];
[request setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(user_id == %@) OR (username == %@)", userID, username];
[request setPredicate:predicate];
if([moc countForFetchRequest:request error:nil]==0){
user = (AN_User *)[NSEntityDescription insertNewObjectForEntityForName:@"AN_User" inManagedObjectContext:moc];
}else{
NSArray *fetchResults = [moc executeFetchRequest:request error:nil];
if(fetchResults.count>0){
user = [fetchResults objectAtIndex:0];
}
}
if(user){
user.user_id = userID;
user.username = username.lowercaseString;
//Parse profile image url
NSString *avatar = [record objectForKey:@"avatar"];
NSString *fileName = [record objectForKey:@"filename"];
if([avatar isKindOfClass:[NSString class]]&&avatar.length>0){
user.profile_image_url = [NSString stringWithFormat:@"%@", avatar];
}else if([fileName isKindOfClass:[NSString class]]&&fileName.length>0){
user.profile_image_url = [NSString stringWithFormat:@"http://www.example.com/forum/avs/%@", fileName];
}
if([record objectForKey:@"gpbp_respect"]){
user.respect = [NSNumber numberWithFloat:[[record objectForKey:@"gpbp_respect"] floatValue]];
}
}
}];
return user;
}
我知道这可能很难分辨,但是任何人都可以告诉我,如果我做错了什么,这些请求是显而易见的。