8

私はこのコアデータエラーで本当に悪い時間を過ごしています。

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

これだけでは分からないかもしれませんが、これらのリクエストで何か間違ったことをしているのかどうか誰かに教えてもらえますか。それはすぐにわかります。

4

1 に答える 1

6

ab / gスレッドでコアデータを呼び出すテーブルをスクロールすると、それが発生し、CoreDataはすべてのコンテキストが1つのスレッドにあることを期待します。

別のSOポスターは、スレッドごとにMOContextを作成することでこれを回避しましたが、複数のスレッドでCRUDを使用するというアイデアは好きではないため、コードの周りにdispatch_async(dispatch_get_main_queue()、)ラッピング関数を配置しました。これまでのところクラッシュはありませんが、まれなので、これについては絶対に確信が持てません。

于 2013-02-21T06:17:17.813 に答える