我想在我的项目中使用领域,但我有一个非常复杂的过滤器和排序。我必须按名称订购列表,但名称在其他类中。
class CustomObject: Object
{
dynamic var objectId = 0
let objectLangs = List<ObjectLang>()
}
class ObjectLang: Object
{
dynamic var objectId = 0
dynamic var name = ""
}
当我有超过130行时,它在主线程中非常慢并且会阻止UI。我尝试在后台线程中执行此操作,但是当我想更新UI时,它被Realm崩溃了。那么什么是完美的解决方案?我怎么能用它?你能给我一个例子或教程吗?我已阅读指南。
答案 0 :(得分:0)
如果在后台线程上更新UI时程序崩溃,则应在领域任务完成时更新主线程上的UI。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), {
let realm = try! Realm()
//do What you need
dispatch_async(dispatch_get_main_queue(), {
//updateUI()
})
})
答案 1 :(得分:0)
您不能跨线程使用Realm访问器。您需要检索要使用它们的线程上的对象。为了实现这一点,我建议每个需要在线程之间传递的对象类将属性指定为主键。在您的情况下,此属性可能为objectId
。
class CustomObject: Object {
dynamic var objectId = 0
let objectLangs = List<ObjectLang>()
override class func primaryKey() -> String {
return "objectId"
}
}
然后可以使用此主键来标识您的对象并将它们传递给主线程以再次检索它们。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0) {
let realm = try! Realm()
var objects = realm.objects(CustomObject)
// objects = objects.filter(…)
let sortedObjects: [CustomObject] = objects.sort { /* … */ }
let ids = sortedObjects.map { $0.objectId }
dispatch_async(dispatch_get_main_queue()) {
let realm = try! Realm()
let objects = ids.map {
realm.objectForPrimaryKey(CustomObject.self, key: $0)
}
updateUIWithObjects(objects)
}
}