2014-04-24 29 views
0

我有一個很奇怪的崩潰,不知道我做錯了什麼。這是代碼。MagicalRecord在保存圖像文件路徑時出現奇怪的崩潰

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); 
    dispatch_async(queue, ^{ 

     [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) { 

      Contact *contact   = [Contact MR_findFirstByAttribute:kCoreData_Contact_ID withValue:strContactID inContext:localContext]; 
      strFilePath     = [Util buildFilePathForImageWithID:contact.c_id withKey:@"ContactPicture"]; 
      contact.c_photoFilePath  = strFilePath; 

     } completion:^(BOOL success, NSError *error) { 

     }]; 

     Contact *contact    = [Contact getContactWithID:strContactID]; 
     NSData *data     = [NSData dataWithContentsOfURL:[NSURL URLWithString:contact.c_photoURL]]; 
     [data writeToFile:strFilePath atomically:YES]; 

     UIImage *image     = [UIImage imageWithData:data]; 
     UIImage *imgToShow    = nil; 
     if (image) 
     { 
      imgToShow     = [SquareAndMask maskImage_72:image]; 
     } 
     else 
     { 
      imgToShow     = [UIImage imageNamed:@"add_rv_photo"]; 
     } 

     dispatch_async(dispatch_get_main_queue(), ^{ 

      //>  Image downloaded, load it 
      [self.imgViewPhoto setImage:imgToShow]; 
      self.imgViewStatusLevel.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@_btn",contact.c_status]]; 
     }); 
    }); 

現在有在我的腦海關於與MR多線程一些混亂,這就是爲什麼上面的代碼可能有問題。但是,我不明白爲什麼它崩潰。

注:我在模擬器上測試,在iPad mini視網膜上測試,對我而言,沒有崩潰。我的客戶正在iPad 3,4上進行測試,並且在運行這部分代碼時他已經崩潰了。

我在做這段代碼:我有一個Contact對象,它保存了照片的url和filePath。所以第一次,沒有圖像保存在本地,我運行這個代碼,下載圖像,並保存在本地,我也保存了一個c_photoFilePath,所以下一次我知道從哪裏拍攝該圖像。

我symbolicated一些崩潰日誌,這是我得到了什麼:

Crash1

Crash2

Crash3

而且,一旦我在模擬器得到這個,機器人不知道這是否是與此相關的崩潰:

CoreData: error: Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. -[__NSCFSet addObject:]: attempt to insert nil with userInfo (null) 

我接受上述代碼的任何詛咒:)只是請幫助我。

回答

2

第一條經驗法則建議:如果您有隨機崩潰的代碼,則很可能是您不正確地執行線程或併發。

其次,你在這裏做的是在後臺調度一個調度。 saveWithBlock方法立即返回。它後面的代碼需要一個同步結果,並且可能會因爲您的數據尚未準備好而崩潰。核心數據也不能正確穿越線程邊界。我建議看看MagicalRecord庫中的MR_inContext:方法。至於修復,我建議不要用調度包裝一個saveWithBlock調用。另外,在完成塊中的數據準備好之後,放入所有您想要運行的代碼。這就是它的目的。

+0

謝謝,你的建議幫助我走上了正確的軌道。非常感謝你。 –