gpt4 book ai didi

ios - Realm 线程困惑

转载 作者:搜寻专家 更新时间:2023-11-01 06:41:54 24 4
gpt4 key购买 nike

所以我正在努力设置一个后台队列,它在自己的线程上执行所有 Realm 写入。我遇到了一些我无法弄清楚的奇怪问题。

问题 #1

我不确定这是否相关(参见帖子:Xcode debug issues with realm)但我的 lldbg 输出确实与某个字段是否存在明显不匹配:消息元素

我的数据类型

OTTOSession

class OTTOSession : Object {
dynamic var messages : MessageList?
dynamic var recordingStart : Double = NSDate().timeIntervalSince1970

func addLocationMessage(msg : dmParsedMessage) -> LocationMessage {
let dmsg : dmLocationMessage = msg as! dmLocationMessage
let locMsg = LocationMessage(locMsg: dmsg)
self.messages!.locationMessages.append(locMsg)
return locMsg;
}
}

消息列表

public class MessageList : Object     {

dynamic var date : NSDate = NSDate();
dynamic var test : String = "HI";
let locationMessages = List<LocationMessage>()
let ahrsMessages = List<AHRSMessage>()
// let statusMessages = List<StatusMessageRLM>()
let logMessages = List<LogMessage>()
}

Realm 互动

在我的代码中,我在 realmQueue 的代码块中创建了新的 OTTOSession

internal var realmQueue = dispatch_queue_create("DataRecorder.realmQueue", 
DISPATCH_QUEUE_SERIAL)

所有 Realm 调用都在这个realmQueue 线程上完成

  dispatch_async(realmQueue) {
self.session = OTTOSession()
}

我也尝试过不同的变体,例如:

  dispatch_async(realmQueue) {
self.session = OTTOSession()

// Directly making a message list
self.session!.messages = MessageList()

//Making a separate message list var
self.messages = MessageList()
self.session!.messages = self.messages
}

我使用 MessageList 的原因是我无法从调试器中判断是否设置了 .messages 变量

录音

一旦我向我的进程发出信号,我想开始记录,然后我实际上对 Realm 进行写入调用(我不是 100% 确定我做的正确)

dispatch_async(realmQueue){

// Update some of the data
self.session!.recordingStart = NSDate().timeIntervalSince1970

// Then start writing the objects
try! Realm().write {

// I've tried different variants of:
let session = self.session!
try! Realm().add(self.session!)
// Or
try! Realm().add(self.session!)

// or
let session = self.session!
session.messages = MessageList()
session.messages!.ahrsMessages
try! Realm().add(self.session!)
try! self.session!.messages = Realm().create(MessageList)
try! Realm().add(self.session!.messages!)

print ("Done")
}
}

基本上,我已经尝试了各种尝试将对象放入 Realm 的组合。

问题:添加具有一对一 关系的对象时,我是必须将两个对象都添加到 Realm 还是只添加 parent 对象导致相关对象也被添加到 Realm

添加数据

当我开始向我的对象添加数据时,事情就开始出错了。

在我的 OTTOSession 对象中,我有以下功能:

func addLocationMessage(msg : dmParsedMessage) -> LocationMessage {
let dmsg : dmLocationMessage = msg as! dmLocationMessage
let locMsg = LocationMessage(locMsg: dmsg)

// THIS LINE IS CAUSING A 'REALM ACCESSED FROM INCORRECT THREAD ERROR
self.messages!.locationMessages.append(locMsg)

return locMsg;
}

我在这一行遇到访问错误:

self.messages!.locationMessages.append(locMsg)

现在函数调用本身包含在以下 block 中:

dispatch_async(realmQueue) {
try! Realm().write {
self.session?.addLocationMessage(msg)
}
}

据我所知,通过查看调试器 - 通过查看代码 - 一切都应该在正确的线程中运行。

我的队列是 SERIAL 所以事情应该一个接一个地发生。我唯一想不通的是,当我在此时中断时,调试器确实显示 messagesnil 但我不能相信这一点,因为:

enter image description here

问题

所以我的问题有两个方面

1) 我将对象添加到 RealmDB 的代码是否正确。即我是否需要为 OTTOSessionMessageList 进行两次单独的 Realm().add 调用,或者我可以单独调用一次吗打电话

2) 有什么可以解释为什么我在这里遇到线程冲突 - 在单个线程上完成我所有的 Realm 写入调用就足够了吗?

最佳答案

1) 不,您不需要对 Realm.add() 进行两次单独的调用。当您将对象添加到 Realm 时,所有相关对象也会被持久化。

2) 您的线程违规很可能源于这样一个事实,即调度队列无法保证执行它们的线程(除了主队列)。所以这意味着你的 Realm 队列在不同的线程上执行。您需要确保从在此线程上打开的 Realm 中检索您的 session 对象。您可能希望为此目的使用主键并在队列/线程之间共享它们。

关于ios - Realm 线程困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34186364/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com