我试图在后台线程上获取领域数据并添加通知块(iOS,Swift)。后台线程上的领域通知令牌
基本例如:
func initNotificationToken() {
DispatchQueue.global(qos: .background).async {
let realm = try! Realm()
results = self.getRealmResults()
notificationToken = results.addNotificationBlock { [weak self] (changes: RealmCollectionChange) in
switch changes {
case .initial:
self?.initializeDataSource()
break
case .update(_, let deletions, let insertions, let modifications):
self?.updateDataSource(deletions: deletions, insertions: insertions, modifications: modifications)
break
case .error(let error):
fatalError("\(error)")
break
}
}
}
}
func initializeDataSource() {
// process the result set data
DispatchQueue.main.async(execute: {() -> Void in
// update UI
})
}
func updateDataSource(deletions: [Int], insertions: [Int], modifications: [Int]) {
// process the changes in the result set data
DispatchQueue.main.async(execute: {() -> Void in
// update UI
})
}
做这件事时,我得到
'Can only add notification blocks from within runloops'
我必须做一些更广泛的处理与返回的数据,并希望只回到主线程时处理完成后更新UI。
另一种方法可能会在后台线程更新后重新获取数据,然后执行处理,但感觉像是可以避免的开销。
有关解决此问题的最佳做法的任何建议?
一些代码和使用的语言将是有用的 –
谢谢@Luca。添加了我正在尝试做的事情的语言和基本示例。 – Nechriz