保存对象时,从错误的线程访问域

时间:2015-05-15 23:31:25

标签: ios objective-c cocoa realm

我正在使用Realm作为消息传递应用。我需要修改一些查询对象,例如,如果对象是尚未包含缩略图的媒体消息。然后我下载它并尝试将其保存到对象。

我可以同时运行多个下载,因为这是在for循环中发生的。如果我为每个对象保存分配一个新的默认Realm实例,为什么会抛出此异常?

我尝试将下载块包装在dispatch_async中,认为它可能是竞争条件或相关的东西,但没有运气,仍然会引发异常。

'RLMException', reason: 'Realm accessed from incorrect thread'

RLMResults *messages = [[Message objectsWhere:@"jabberID = %@", self.recipientJID] sortedResultsUsingProperty:@"date" ascending:YES];

for (Message *message in messages) {
  if (!message.hasThumbData) {

    [self downloadMedia:message.remoteMediaURL success:^(NSData *mediaData) {

      RLMRealm *realm = [RLMRealm defaultRealm];
      [realm beginWriteTransaction];
      message.hasThumbData = YES;
      message.thumbData = mediaData;
      [realm commitWriteTransaction]; 

    } failure:^(NSError *error) {
      NSLog(@"Error downloading media: %@", error.description);
    }];

  }
} 

1 个答案:

答案 0 :(得分:2)

持久Realm对象只能在获取它们的同一个线程上读取或写入。假设[self downloadMedia:success:failure:]的成功块在与messages不同的线程上被调用,这意味着您无法在块中使用message。为当前线程创建新的RLMRealm实例对捕获的变量没有任何影响。