2012-12-19 2 views
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; 
} 

나는 그냥이에서에게 아마 힘들 이해하지만, 내가 뭔가 잘못하고 있어요 경우 사람이 이러한 요청과 함께, 그 즉시 분명하다, 나를 알 수 있습니다.

+0

[예외 중단 점 추가] (http://stackoverflow.com/questions/4961770/run-stop-on-objective-c-exception-in-xcode-4). 오류를 다시 트리거하십시오. 디버그 탐색기에서 스택 추적을 복사하여 질문에 붙여 넣으십시오. –

+0

감사합니다. 이 작업을 시도했지만 오류를 복제 할 수 없습니다. 나는 어쨌든 그것을 고쳤다 고 생각한다. –

답변

6

b/g 스레드에서 코어 데이터를 호출하는 테이블을 스크롤하면 코어 데이터가 모든 스레드를 한 스레드에 포함 할 것으로 예상됩니다.

또 다른 SO 포스터는 스레드마다 MOContext를 작성하여이 문제를 해결했지만 여러 스레드에 CRUD 아이디어가 마음에 들지 않으므로 코드 주위에 dispatch_async (dispatch_get_main_queue(),) 배치 기능을 넣었습니다. 지금까지 충돌은 없지만 드물기 때문에 나는 이것에 대해 절대 확신하지 않습니다.

관련 문제