【问题标题】:Save objects in realm from another thread?从另一个线程保存领域中的对象?
【发布时间】:2016-02-09 20:49:07
【问题描述】:

当我尝试在后台保存对象时,出现异常 - “从不正确的线程访问领域。” 这是领域的初始化 - “self.realm = [RLMRealm defaultRealm]”

我在后台保存对象到领域的方法:

- (IBAction)saveProduct:(id)sender {
    Product *product = [Product new];
    [self.productService addProduct:product onSuccess:^{

        NSLog(@"Succes");

    } onFailure:^(NSError *error) {
        NSLog(@"Error");

    }];
}
- (void)addProduct:(NSObject *)order onSuccess:(success)success onFailure:(failure)failure
{
    __weak __typeof(self)weakSelf = self;
    dispatch_async(self.queue, ^{
          __strong __typeof(weakSelf) strongSelf = weakSelf;

          [strongSelf.dao saveProduct:order];
           dispatch_async(strongSelf.mainQueue, ^{
                success();
           });
     });

}

- (void)saveProduct:(NSObject *)product
{
     ProductModel *model = [self ponsoToModel:product];
     [self.dataBase saveObject:model];
}

- (void)saveObject:(RLMObject *)object
{
     [self.realm beginWriteTransaction];
     [self.realm addObject:object];
     [self.realm commitWriteTransaction];
     [self dataBaseDidSave];
}

【问题讨论】:

  • 上面的代码应该是某种方法吗?
  • @Alistra 我更新我的问题,如果有帮助的话。

标签: objective-c multithreading grand-central-dispatch realm


【解决方案1】:

来自文档:

RLMRealm 实例不是线程安全的,不能跨共享 线程或调度队列。您必须在每个线程上调用此方法 你想与领域互动。对于调度队列,这 意味着您必须在调度的每个块中调用它,作为 队列不保证在一致的线程上运行

【讨论】:

  • 从技术上讲,它们是“线程安全的”,因为它们是线程受限的,不能从两个不同的线程访问。您在其上看到的线程将始终看到一致的数据视图。但是是的,您必须为给定线程打开一个 Realm 实例,并且您只能访问属于最初创建它们的给定线程的 RealmObjects、RealmResults 和 Realms。
猜你喜欢
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多