【问题标题】:Doesn't MagicalRecord work in background thread?MagicalRecord 不能在后台线程中工作吗?
【发布时间】:2014-10-17 19:22:45
【问题描述】:

似乎我什么都试过了,但它似乎只在主线程中有效。例如:

[SomeClass MR_createEntity];
[[NSManagedObjectContext MR_defaultContext] MR_saveWithOptions:MRSaveSynchronously completion:^(BOOL success, NSError *error) {

        if (success) {
            NSLog(@"You successfully saved your context.");
        } else if (error) {
            NSLog(@"Error saving context: %@", error.description);
        }
    }];

如果此代码在主线程中运行,则success == YES 否则(在后台线程中)它给出success == NO。在这两种情况下error == nil

那么在后台线程中调用保存是不可能的吗?

【问题讨论】:

  • 默认上下文是主线程上下文。也许您的意思是 [NSManagedObjectContext MR_saveWithBlock:] 方法?
  • 这个库很奇怪。现在它起作用了……每秒钟一次。为什么?!检查了一切,问题出在图书馆

标签: ios multithreading thread-safety magicalrecord background-thread


【解决方案1】:

完成块总是从主线程调用,下面是一个应该可以工作的例子:

Person *person = ...;

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext){

  Person *localPerson = [person MR_inContext:localContext];
  localPerson.firstName = @"John";
  localPerson.lastName = @"Appleseed";

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

  self.everyoneInTheDepartment = [Person findAll];

}];

参考:https://github.com/magicalpanda/MagicalRecord/blob/master/Docs/Working-with-Managed-Object-Contexts.md

【讨论】:

    【解决方案2】:

    最后,我没有用完全背景的 MagicalRecord 工作来创建一个可行的项目。

    对我来说最好的解决方案是仅在主线程中更新数据库并在任何线程(包括后台)中读取数据库。此外,我还展示了有关数据库更新的自定义进度视图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 2013-06-05
      相关资源
      最近更新 更多