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