2013-11-22 124 views
1

保存時,我有這將創建一個單獨的線程的方法崩潰:應用程序在不同的線程

// Create thread 
dispatch_queue_t uniqueQueue = dispatch_queue_create("Unique Email Queue", NULL); 

// Run block on another thread called downloadQueue 
dispatch_async(uniqueQueue, ^{ 

    // Save to core data for redundancy 
     User *coreDataUser = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:self.managedObjectContext]; 

     coreDataUser.username = [emailStr lowercaseString]; 
     coreDataUser.email = emailStr; 
     coreDataUser.name = nameStr; 

     NSError *error; 

     if (![self.managedObjectContext save:&error]) 
     { 
      NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); 
     }    
    } 

的應用總是崩潰在這條線:

User *coreDataUser = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:self.managedObjectContext]; 

我使用本教程作爲參考:http://www.codigator.com/tutorials/ios-core-data-tutorial-with-example/

我錯過了什麼?

+0

你得到消息或類似的東西? – AntonijoDev

+0

不,我只是得到sigabrt kill_thread – cdub

回答

3

記住 - CoraData不是線程安全的!!!!!

如果你想爲你的managedObjectContext分開線程,你必須在這個線程上創建一個線程。要調用正確的上下文,您必須使用performBlock塊來運行它。你的情況:

[self.managedObjectContext performBlock:^{ 
     User *coreDataUser = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:self.managedObjectContext]; 

     coreDataUser.username = [emailStr lowercaseString]; 
     coreDataUser.email = emailStr; 
     coreDataUser.name = nameStr; 

     NSError *error; 

     if (![self.managedObjectContext save:&error]) 
     { 
      NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); 
     } 
}]; 

但要記住,如果你在mainThread創設情境,你的塊也mainThread執行。

+0

這隻適用於iOS 5 API。 –

4

NSManagedObjectContext不是線程安全的,請嘗試在異步塊的一側創建新的moc。 嘗試:「找不到這個型號命名爲‘用戶’實體」

// Create thread 
dispatch_queue_t uniqueQueue = dispatch_queue_create("Unique Email Queue", NULL); 

// Run block on another thread called downloadQueue 
dispatch_async(uniqueQueue, ^{ 

    // Save to core data for redundancy 
     NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init]; 
    [context setPersistentStoreCoordinator:persistentStoreCoordinator]; 

     User *coreDataUser = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:context]; 

     coreDataUser.username = [emailStr lowercaseString]; 
     coreDataUser.email = emailStr; 
     coreDataUser.name = nameStr; 

     NSError *error; 

     if (![context save:&error]) 
     { 
      NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); 
     }    
    } 

持久性存儲在你的AppDelegate

+0

爲什麼這個答案已經被低估? –

+0

我upvote你的問題,因爲它沒關係,但你提供一些其他的信息。相反,您應該添加它作爲評論。 –

+0

我在問自己同樣的問題,但我有點習慣了沒有理由的人downvoting答案:)。謝謝你的建議,我會提供更詳細的答案... – AntonijoDev

相關問題