从错误的线程访问领域-Swift 3

App*_*eIt 4 multithreading realm grand-central-dispatch ios swift

我的首要任务UITableViewController是:

let queue = DispatchQueue(label: "background")
Run Code Online (Sandbox Code Playgroud)

删除任务后,将执行以下操作:

self.queue.async {
    autoreleasepool {
        let realm = try! Realm()
        realm.beginWrite()
        realm.delete(task)
        do {
            try realm.commitWrite()
        } catch let error {
            self.presentError()
        }
    } 
 }
Run Code Online (Sandbox Code Playgroud)

然后我收到错误

以realm :: IncorrectThreadException类型的未捕获异常终止:从错误线程访问的领域。

我该如何解决?

Sam*_*tha 6

看起来写操作发生在与最初访问该对象不同的线程上。您应该能够通过传递taskID并使用该ID 来修复它,然后再执行写操作(在异步块内部),然后从数据库中获取它。

所以在顶部:

var taskId = 0  // Set this accordingly
Run Code Online (Sandbox Code Playgroud)

然后像

self.queue.async {
    autoreleasepool {
        let realm = try! Realm()
        let tempTask = // get task from Realm based on taskId
        realm.beginWrite()
        realm.delete(tempTask)
        do {
            try realm.commitWrite()
        } catch let error {
            self.presentError()
        }
    } 
 }
Run Code Online (Sandbox Code Playgroud)