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

Posted

技术标签:

【中文标题】保存对象时从错误线程访问的领域【英文标题】:Realm accessed from incorrect thread when saving object 【发布时间】:2015-05-15 23:31:24 【问题描述】:

我正在将 Realm 用于消息传递应用程序。我需要修改一些查询的对象,例如,如果对象是还没有缩略图的媒体消息。然后我下载它并尝试将其保存到对象中。

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

我尝试将下载块包装在 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】:

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

【讨论】:

成功块在主线程上被调用,RLMResults也是如此。 @MarcosCurvello 您找到解决方案了吗?我也有同样的情况。 不,我没有找到解决方案。我觉得这很有趣,因为我知道所有操作都是在主线程上执行的。 @Thomas Goyne这里有什么建议吗? 你是否有可能在后台线程上清除块? @segiddins 不,这是可能的,当用户点击已经有缩略图的媒体下载完整资源时,我使用的是相同的下载块,在这种情况下,我可以重新保存我的 RLMObject。

以上是关于保存对象时从错误线程访问的领域的主要内容,如果未能解决你的问题,请参考以下文章

下载完成后从错误的线程访问领域 Swift 3

我想对从iOS领域读取的数据进行线程处理

从不正确的线程访问的领域 - 再次

Xamarin 表单 - 从不正确的线程访问的领域

使用 rxjava 和 dagger2 跨线程访问领域

领域对象服务器 - 错误:您的请求参数未验证