2015-11-05 29 views
0
TTNetworkDataSource* netSource = [TTNetworkDataSource sharedSource]; 
    [netSource setContext:self]; 

    TTDataSourceResponse* districtsResponse = [netSource requestDataWithQuery:@{@(OBJECT_TYPE): [HotlineDistrict clsName]}]; 


    if (districtsResponse != nil) { 
     NSArray* objects = [self executeFetchRequestUnsafe:[NSFetchRequest fetchRequestWithEntityName:[HotlineDistrict clsName]] error:&localError]; 

     NSInteger i = 0; 

     if (localError != nil) { 
      result = NO; return; 
     } else { 
      NSLog(@"%lu = fetchedObjects, %lu = districtsResponse", (unsigned long)objects.count, (unsigned long)districtsResponse.objects.count); 
      for (NSManagedObject* obj in objects) { 
       NSLog(@"Deleted Objects in fetched objects %ld", (unsigned long)i++); 
       [self deleteObject:obj]; 
      } 

      for (NSManagedObject* obj in districtsResponse.objects) { 
       NSLog(@"Inserted Object in districtsResponse %ld", (unsigned long)i++); 
       [self insertObject:obj]; 
      } 
     } 
    } else { 
     localError = [NSError errorInfo:@{NSLocalizedDescriptionKey: @"Error when getting districts."}]; 
     result = NO; 
    } 

    TTDataSourceResponse* requestTypeResponse = [netSource requestDataWithQuery:@{@(OBJECT_TYPE): [HotlineRequestType clsName]}]; 


    if (requestTypeResponse != nil) { 
     NSArray* objects = [self executeFetchRequestUnsafe:[NSFetchRequest fetchRequestWithEntityName:[HotlineRequestType clsName]] error:&localError]; 

     NSInteger j = 0; 

     if (localError != nil) { 
      result = NO; return; 
     } else { 
      NSLog(@"%lu = fetchedObjects, %lu = requestTypeResponse", (unsigned long)objects.count, (unsigned long)requestTypeResponse.objects.count); 
      for (NSManagedObject* obj in objects) { 
       NSLog(@"Deleted Objects in fetched objects %ld", (unsigned long)j++); 
       [self deleteObject:obj]; 
      } 

      for (NSManagedObject* obj in requestTypeResponse.objects) { 
       NSLog(@"Deleted Objects in requestTypeResponse %ld", (unsigned long)j++); 
       [self insertObject:obj]; 
      } 
     } 
    } else { 
     localError = [NSError errorInfo:@{NSLocalizedDescriptionKey: @"Error when getting request types."}]; 
     result = NO; 
    } 

這裏是我的代碼,[自DeleteObject的:OBJ]後:DeleteObject的掛我的應用程序

NSLog(@"%lu = fetchedObjects, %lu = districtsResponse", (unsigned long)objects.count, (unsigned long)districtsResponse.objects.count); 

給這樣的結果:

802我的應用程序被掛起

手動調試= fetchedObjects,47 =區響應

NSLogs在循環中枚舉對象,總的來說,我們有了fetchedObjects和districtsResponse,即使將NSLog放在循環體的末尾也是如此。所以它說這個循環完成得很好。但該應用程序是掛起。那些循環2,它不會觸及第二個循環,如果我們用deleteObject刪除這些循環 - 它就可以工作。

+0

處於Async_Block或其他自己的線程運行此代碼? CoreData在後臺線程中不起作用。 –

+0

你在單獨的for循環中有2個'deleteObject'調用 - 哪一個會導致它掛起? – noobsmcgoobs

+0

克勞斯,我不知道,但我認爲它是在同步線程,在[self performUpdateBlockAndWait:^ {...我的代碼...}]中的所有這種構造; (void)performUpdateBlockAndWait:(void(^)())updateBlock { dispatch_sync(update_queue,updateBlock); } noobsmcgoobs,兩者如果刪除第一個循環,它掛在第二 夥計們,對不起,我的英語,我在新手objc –

回答

0

我找到了答案,我們的API sended零值的實體所需要的屬性,但無論如何,非常感謝球員

0

你不能繼承的NSManagedObjectContext蘋果說:

https://developer.apple.com/library/prerelease/ios/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/index.html

子類注 因此強烈建議您繼承的NSManagedObjectContext氣餒。更改跟蹤和撤消管理機制高度優化,因此錯綜複雜。插入自己的可能影響processPendingChanges的額外邏輯可能會產生無法預料的後果。在諸如商店遷移之類的情況下,核心數據將創建自己使用的NSManagedObjectContext的實例。在這種情況下,您不能依賴您的自定義子類的任何功能。任何NSManagedObject子類都必須始終與NSManagedObjectContext完全兼容(也就是說,它不能依賴NSManagedObjectContext的子類的特性)。

+0

如果您正在創建類工廠方法,則子類「NSManagedObjectContext」不是一個罪過。這實際上非常有用。更可能出現的問題是將GCD'dispatch_sync'與具有自己隊列的MOC結合使用。應該使用'performBlockAndWait' ... – stevesliva