从API获取数据后,我想在后台更新Realm
项目的某些属性。一些API调用需要链接起来,也就是说,一个调用馈入另一个调用的结果。 PromiseKit
对此很有希望,但是我很难为Realm选择正确的线程。
let utiliQueue = DispatchQueue.global(qos: .utility)
utiliQueue.async {
autoreleasepool {
let realm = try! Realm()
let itemList = DataManager.getSorterFor("ItemList", in: realm).items
for item in itemList {
firstly {
YouTube.getChannelUploadsPlaylistAndBannerURL(item)
}.done(on: utiliQueue) { (playlistId: String, bannerURL: String) in
try! item.realm!.write {
item.playlistId = playlistId
item.bannerImageURL = bannerURL
}
}.catch { error in
print(error.localizedDescription)
}
}
}
}
当我完成写事务时,我从Realm获得了IncorrectThreadException
。我曾尝试告诉PromiseKit在正确的DispatchQueue
上运行它,如上面的代码所示,但是我仍然遇到异常。我知道跨线程使用Realm对象的解决方法,但这应该可以在同一线程上执行,对吗?
答案 0 :(得分:1)
这里的简短答案是,上面的代码将根据您的请求对两个任务使用相同的调度队列,但这并不意味着它们将在同一线程上运行。 GCD(大中央调度)将使用其线程池中的线程来运行每个任务,但是您不能使用调度队列来确保使用相同的线程。