2014-04-30 32 views
0

什麼在哪裏[MagicalRecord saveWithBlock:completion:]將顯示NO在完成塊的成功和具有零的錯誤的情況?我見過iOS的:成功的條件是NO和錯誤是零爲[MagicalRecord saveWithBlock:完成:]

的一個條件就是一個取保存塊內的回報爲零,因此沒有保存的事情。但是我看到了保存塊中的提取返回有效的託管對象的情況。

示例代碼:

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) { 
    TransactionQueueItem *item = [self queueItemForToken:token context:localContext]; 
    if (nil == item) 
     NSLog(@"item is nil for token %@", token); 

    item.lastTryDate = [NSDate date]; 
    if (nil != errorMsg) 
     item.lastTryError = errorMsg; 
    } 
    completion:^(BOOL success, NSError *error) { 
    if (!success) 
     { 
     NSLog(@"Error %@ updating last Try time item for token %@", error, token); 
     } 
     else 
     { 
     if (nil != completionBlock) 
      completionBlock(); 
     } 
    }]; 

我看到,該項目回來好,但再上保存我獲得成功= NO和錯誤=零,我沒有看到發生了什麼。

各種谷歌/冰搜索沒有指出結論性的結果。謝謝。

回答

3

我遇到了同樣的誤解,但似乎success只是表示它沒有保存數據,不是說發生了錯誤。如果沒有數據要保存,它將不會返回成功,但您的數據仍然存在。

這是日誌輸出具有successNOerrornil後我得到:

-08-01 14:07:01.003 TEST[39216:f03] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8dbac50) → Saving <NSManagedObjectContext (0x8dbac50): *** UNNAMED ***> on *** BACKGROUND THREAD *** 
2014-08-01 14:07:01.003 TEST[39216:f03] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8dbac50) → Save Parents? 1 
2014-08-01 14:07:01.004 TEST[39216:f03] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8dbac50) → Save Synchronously? 0 
2014-08-01 14:07:01.004 TEST[39216:f03] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8db99c0) NO CHANGES IN ** BACKGROUND SAVING (ROOT) ** CONTEXT - NOT SAVING 

而在NSManagedObjectContext+MagicalSave.m:41文件,你會看到,它會檢查當前環境的變化,但沒有按」如果沒有新數據,則保存它:

if (![self hasChanges]) { 
    MRLog(@"NO CHANGES IN ** %@ ** CONTEXT - NOT SAVING", [self MR_workingName]); 

    if (completion) 
    { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      completion(NO, nil); 
     }); 
    } 

    return; 
} 
0

成功參數是調用的結果保存:在localContext。也就是說,MagicalRecord會爲您執行一些基本的錯誤處理和其他日誌記錄,幷包裝save:方法。除了MagicalRecord已爲您提供的服務之外,我們會在此回調中爲您返回該價值,讓您有機會自行處理任何問題。

+2

但是,如果error = nil,我怎麼知道問題是如何處理的? – chadbag

+0

我無法保存創建的nsobject。我跟了這幫助https://gist.github.com/tonyarnold/4694673#standard-background-save,我可以從MR得到的唯一信息是錯誤==零和contextDidSave == NO。如果我打開詳細的調試,我得到**沒有更改saveWithBlock:完成:**上下文 - 不保存。但有變化。 –

+0

我已修復它。始終在上下文中工作是非常重要的:1)由MR保存api(版本2.3.0+)或作爲屬性存儲的自定義上下文提供的那個。我讓代碼使用一個沒有上下文的代碼,它被發現/創建/更改並且是錯誤的。查看更多http://stackoverflow.com/a/24171856/3389683這裏https://github.com/magicalpanda/MagicalRecord/blob/master/Docs/Working-with-Managed-Object-Contexts.md 這是在創建/更新/刪除可以在saveWithBlock中使用的ns對象的所有方法中有一個參數「inContext:(NSManagedObjectContext *)context」 –

相關問題