2012-01-25 87 views
1

我的代碼運行時出現故障:在後臺線程核心的數據遷移作爲UIBackgroundTask

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
     @autoreleasepool {    
      // Now on a background thread 

      // Setup background task 
      __block UIBackgroundTaskIdentifier bgTask; 

      void (^finishBackgroundTask)(void) = ^(void) { 
       [[UIApplication sharedApplication] endBackgroundTask:bgTask]; 
       bgTask = UIBackgroundTaskInvalid; 
      }; 

      // Start background task 
      bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:finishBackgroundTask]; 

      // The method below migrates a core data database and takes ages 
      [MyClass migrateCoreDataStuff]; 

      finishBackgroundTask(); 
     } 
    }); 

我得到的錯誤是NSUnderlyingException = "Fatal error. The database at /var/mobile/Applications/55B83D5F-CCF5-438E-BECA-B97DB5505541/Documents/Blah.sqlite is corrupted. SQLite error code:11, 'database disk image is malformed'";

遷移錯誤,只有當以下都是真會發生: *遷移是在後臺線程 *遷移正在作爲UIBackgroundTask *我在設備上運行,而不是一個模擬器

我跑的iOS 4.3。 5,建設iOS 4.0。

+0

哎呦......算出來了。除了主線程外,任何人都不應該在UIKit中調用anthing。在這種情況下,我開始後臺任務('[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:]'),從而從後臺線程傳遞我的UIApplication實例。哪個*不好*。 – diachedelic

+0

這是更正的代碼: – diachedelic

+2

__block UIBackgroundTaskIdentifier bgTask; void(^ finishBackgroundTask)(void)= ^(void){[UIApplication sharedApplication] endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; }; bgTask = [[UIApplication的sharedApplication] beginBackgroundTaskWithExpirationHandler:finishBackgroundTask]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0),^ { @autoreleasepool { [MyClass的migrateCoreDataStuff]; dispatch_async(dispatch_get_main_queue(),finishBackgroundTask); } }); – diachedelic

回答

0

沒有看到migrateCoreDataStuff的內容,很難看到確切的問題。但是,非主線程上的核心數據是一個棘手的問題。讀一讀http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/CoreData/Articles/cdConcurrency.html。至少,您可能需要爲新線程創建單獨的託管對象上下文。

+0

是的,該方法是巨大的,我不能在這裏發佈,但實質上是從http://media.pragprog.com/titles/mzcd/code/ProgressiveMigration/AppDelegate.m(我使用單獨的上下文正如你所建議的那樣,當migrateCoreDataStuff正在運行時,應用程序中沒有其他任何東西可能訪問持久性存儲) – diachedelic

+0

代碼的簡要說明表明您正在共享託管對象上下文?至少,創建它的地方只有一個,並且該參考將在未來每次調用時返回? –