2013-11-22 160 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

相关问题