2012-12-19 14 views
8

Bu temel veri hatasıyla gerçekten kötü bir zaman geçiriyorum.Çekirdek Veriler + 'ifadesi hala etkin'

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason:  'statement is still active' 

Uygulamam ve kodum, istekleri çok hızlı bir şekilde arandığında bazen sorunsuz çalışıyor. Uygulamayı kırmaya çalıştığımda olur. Bir ekrandan diğerine gitmek, veri indirmek ve getirme isteklerini yürütmek.

İş parçacığı ve çekirdek verileriyle ilgili bir şey olduğunu biliyorum.

Bu yönetilen kodu, kendi yönetilen nesne bağlamıyla arka plan iş parçacığından arıyorum.

+ (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; 
} 

Ben sadece bundan söylemek muhtemelen zor anlıyorum ama ben yanlış bir şey yapıyorsam herkes bu istekleri ile, yani hemen göze çarpmaktadır, bana söyleyebilir.

+0

[Bir özel durum kesme noktası ekleyin] (http://stackoverflow.com/questions/4961770/run-stop-on-objective-c-exception-in-xcode-4). Hatayı tekrar tetikle. Yığın izlemesini Debug Navigator'dan kopyalayın ve sorunuza yapıştırın. –

+0

Teşekkürler. Bunu yapmaya çalıştım ama hatayı tekrarlayamadım. Sanırım yine de tamir ettim. –

cevap

6

Bir b/g iş parçacığında çekirdek verileri çağıran bir tablo kaydırırsanız, gerçekleşir ve Çekirdek Veriler, içeriğin tümünü tek bir iş parçacığına sahip olmasını bekler.

Başka bir poster bu iş parçacığı başına bir MOContext oluşturarak çalışmıştı, ancak çok sayıda iş parçacığı üzerinde CRUD düşüncesini beğenmedim, bu yüzden kodumun etrafında bir dispatch_async (dispatch_get_main_queue(),) sarma işlevi koydum. Şimdiye kadar çökme yok, ama nadiren bu yüzden kesinlikle emin değilim.

İlgili konular