gpt4 book ai didi

ios - 核心数据 + 'statement is still active'

转载 作者:可可西里 更新时间:2023-11-01 03:11:40 26 4
gpt4 key购买 nike

这个核心数据错误让我很不爽。

*** 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;
}

我知道仅凭这一点可能很难判断,但是如果我做错了什么,任何人都可以告诉我,对于这些请求,这是显而易见的。

最佳答案

如果您滚动一个在 b/g 线程上调用核心数据的表,它就会发生,而核心数据希望将上下文全部放在一个线程上。

另一个 SO 海报通过为每个线程创建一个 MOContext 来解决这个问题,但我不喜欢在多个线程上进行 CRUD 的想法,所以我只是在我的代码周围放置了一个 dispatch_async (dispatch_get_main_queue(), ) 包装函数。到目前为止没有崩溃,但这种情况很少见,所以我对此不是绝对确定。

关于ios - 核心数据 + 'statement is still active',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13948069/

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