解析 Realm 模型时应用程序崩溃或冻结
App crashes or freezes when parsing Realm models
我有这个 Realm 模型定义:
class PSTChatThread: RLMObject {
dynamic var channelName = ""
dynamic var environment = RLMObject(object: PSTChannelEnv.className())
dynamic var chatMessages = RLMArray(objectClassName: PSTMessage.className())
}
class PSTChannelEnv: RLMObject {
dynamic var associatedPlaceId = 0
dynamic var chattingWithUuid = ""
dynamic var chattingWithUsername = ""
dynamic var hasSessionEnded = false
dynamic var unreadMessages = 0
}
class PSTMessage: RLMObject {
// type
dynamic var typeRaw = ""
var type: PSTProtocolMsgTypes {
get {
if let a = PSTProtocolMsgTypes(rawValue: typeRaw) {
return a
}
return .ChatMsg
}
}
// envelope
dynamic var channel = ""
dynamic var timeoken = 0
}
class ChatMsg: PSTMessage {
dynamic var msgId = ""
dynamic var text = ""
dynamic var username = ""
dynamic var uuid = ""
dynamic var associatedPlaceId = -1
}
class ACKMsg: PSTMessage {
dynamic var forId = ""
dynamic var uuid = ""
}
class UserTypingMsg: PSTMessage {
dynamic var uuid = ""
}
class UserStoppedTypingMsg: PSTMessage {
dynamic var uuid = ""
}
class SessionUpdateMsg: PSTMessage {
dynamic var hasSessionEnded = false
dynamic var uuid = ""
}
class ContactDetailsMsg: PSTMessage {
dynamic var accessLevel = -1
dynamic var uuid = ""
}
class ReadReceiptMsg: PSTMessage {
dynamic var uuid = ""
}
- 当我 运行 应用程序时,它崩溃了:
prop.column = table.add_column_link(tightdb::DataType(prop.type), prop.name.UTF8String, *linkTable);
和 EXC_BAD_ACCESS
- 假设模型是从上到下解析的,如果我将
PSTChatThread
移到底部,应用程序就会冻结。没有崩溃或任何东西,只是变得反应迟钝。
PSTChatThread
定义似乎有问题。如果这被注释掉,一切似乎都工作正常。
每当我对模型进行 RMRealm
调用或任何其他查询调用时,都会发生这种情况。
如果我的子类化逻辑,我想再问一件事。有什么方法可以使 PSTMessage
不会持久化到架构中,而只有它的子类才能持久化?
谢谢
这一行有问题
dynamic var environment = RLMObject(object: PSTChannelEnv.className())
只需
dynamic var environment: PSTChannelEnv
我们有 objectClassName... 的原因是因为您正在创建一个类型为 objectClassName 的数组。做一对一关系时,你已经知道对象class,所以你可以直接设置类型
setting up your models in Realm
上有更多文档
不过,当您尝试执行此类操作时,我们应该会抛出一个错误。感谢您指出这一点!
我有这个 Realm 模型定义:
class PSTChatThread: RLMObject {
dynamic var channelName = ""
dynamic var environment = RLMObject(object: PSTChannelEnv.className())
dynamic var chatMessages = RLMArray(objectClassName: PSTMessage.className())
}
class PSTChannelEnv: RLMObject {
dynamic var associatedPlaceId = 0
dynamic var chattingWithUuid = ""
dynamic var chattingWithUsername = ""
dynamic var hasSessionEnded = false
dynamic var unreadMessages = 0
}
class PSTMessage: RLMObject {
// type
dynamic var typeRaw = ""
var type: PSTProtocolMsgTypes {
get {
if let a = PSTProtocolMsgTypes(rawValue: typeRaw) {
return a
}
return .ChatMsg
}
}
// envelope
dynamic var channel = ""
dynamic var timeoken = 0
}
class ChatMsg: PSTMessage {
dynamic var msgId = ""
dynamic var text = ""
dynamic var username = ""
dynamic var uuid = ""
dynamic var associatedPlaceId = -1
}
class ACKMsg: PSTMessage {
dynamic var forId = ""
dynamic var uuid = ""
}
class UserTypingMsg: PSTMessage {
dynamic var uuid = ""
}
class UserStoppedTypingMsg: PSTMessage {
dynamic var uuid = ""
}
class SessionUpdateMsg: PSTMessage {
dynamic var hasSessionEnded = false
dynamic var uuid = ""
}
class ContactDetailsMsg: PSTMessage {
dynamic var accessLevel = -1
dynamic var uuid = ""
}
class ReadReceiptMsg: PSTMessage {
dynamic var uuid = ""
}
- 当我 运行 应用程序时,它崩溃了:
prop.column = table.add_column_link(tightdb::DataType(prop.type), prop.name.UTF8String, *linkTable);
和EXC_BAD_ACCESS
- 假设模型是从上到下解析的,如果我将
PSTChatThread
移到底部,应用程序就会冻结。没有崩溃或任何东西,只是变得反应迟钝。
PSTChatThread
定义似乎有问题。如果这被注释掉,一切似乎都工作正常。
每当我对模型进行 RMRealm
调用或任何其他查询调用时,都会发生这种情况。
如果我的子类化逻辑,我想再问一件事。有什么方法可以使 PSTMessage
不会持久化到架构中,而只有它的子类才能持久化?
谢谢
这一行有问题
dynamic var environment = RLMObject(object: PSTChannelEnv.className())
只需
dynamic var environment: PSTChannelEnv
我们有 objectClassName... 的原因是因为您正在创建一个类型为 objectClassName 的数组。做一对一关系时,你已经知道对象class,所以你可以直接设置类型
setting up your models in Realm
上有更多文档不过,当您尝试执行此类操作时,我们应该会抛出一个错误。感谢您指出这一点!