主线程不等待后台线程在Swift中完成

时间:2015-06-03 07:51:11

标签: multithreading swift realm

这是我的问题:我正在做后台工作,在那里我解析一些JSON并将一些对象写入我的Realm,在主线程中我尝试更新UI(重新加载TableView,它链接到一个数组宾语)。但是当我重新加载UI时,我的tableView没有更新,就像我的Realm没有更新一样。我有重新加载我的视图以查看更新。这是我的代码:

    if (Realm().objects(Objects).filter("...").count > 0)
    {
        var results = Realm().objects(Objects) // I get the existing objects but it's empty
        tableView.reloadData()
    }
    request(.GET, url).responseJSON() {
    (request, response, data, error) in
    let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
        dispatch_async(dispatch_get_global_queue(priority, 0)) {
            // Parsing my JSON
            Realm().write {
                Realm().add(object)
            }
            dispatch_sync(dispatch_get_main_queue()) {
                // Updating the UI
                if (Realm().objects(Objects).filter("...").count > 0)
                {
                    results = Realm().objects(Objects) // I get the existing objects but it's empty
                    tableView.reloadData()
                }
            }
        }
    }

我必须用我的线程做坏事,但我找不到什么。有人知道什么是错的吗?

感谢您的回答!

2 个答案:

答案 0 :(得分:3)

这样的工作流程对我来说更有意义:

let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority, 0)) {
    // Parsing my JSON
    Realm().write {
        Realm().add(object)
        dispatch_sync(dispatch_get_main_queue()) {
            // Updating the UI
            if (Realm().objects(Objects).filter("...").count > 0)
            {
                results = Realm().objects(Objects) // I get the existing objects but it's empty
                tableView.reloadData()
            }
        }
    }    
}

注意:您的原始工作流程中的计时有问题:在执行写入块之前,可能会更新 ,这就是您的UI看起来被放弃的原因;根据他们的表现计划,上面的这个想法将是任务之间更加同步的方式。

答案 1 :(得分:0)

您正在获取一些新对象并将其存储到"结果"中。

tableView.reloadData()应该如何访问该变量?您必须更改tableView委托将访问的某些

PS。每个dispatch_sync()都是潜在的死锁。你正在使用一个毫无意义的。避免使用dispatch_sync,除非您有非常非常好的理由使用它。