Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 主螺纹不';t等待后台线程在Swift中完成_Multithreading_Swift_Realm - Fatal编程技术网

Multithreading 主螺纹不';t等待后台线程在Swift中完成

Multithreading 主螺纹不';t等待后台线程在Swift中完成,multithreading,swift,realm,Multithreading,Swift,Realm,这是我的问题:我正在做一个后台工作,解析一些JSON并将一些对象写入我的领域,在主线程中我尝试更新UI(重新加载TableView,它链接到一个对象数组)。但是当我重新加载UI时,我的tableView不会更新,就像我的领域没有更新一样。我有重新加载我的视图以查看更新。这是我的密码: if (Realm().objects(Objects).filter("...").count > 0) { var results = Realm().objects(Ob

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

    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()
                }
            }
        }
    }
我不得不用我的线程做一些不好的事情,但我找不到什么。有人知道怎么了吗


谢谢你的回答

您正在获取一些新对象并将它们存储到“结果”中

tableView.reloadData()应该如何访问该变量?您必须更改tableView代理将访问的内容


另外,每个调度同步()都是一个潜在的死锁。你使用的是一个毫无意义的。除非您有非常非常好的理由使用它,否则请避免使用dispatch\u sync

您正在获取一些新对象并将它们存储到“结果”中

tableView.reloadData()应该如何访问该变量?您必须更改tableView代理将访问的内容


另外,每个调度同步()都是一个潜在的死锁。你使用的是一个毫无意义的。除非您有非常非常好的理由使用它,否则请避免使用dispatch\u sync

您正在获取一些新对象并将它们存储到“结果”中

tableView.reloadData()应该如何访问该变量?您必须更改tableView代理将访问的内容


另外,每个调度同步()都是一个潜在的死锁。你使用的是一个毫无意义的。除非您有非常非常好的理由使用它,否则请避免使用dispatch\u sync

您正在获取一些新对象并将它们存储到“结果”中

tableView.reloadData()应该如何访问该变量?您必须更改tableView代理将访问的内容


另外,每个调度同步()都是一个潜在的死锁。你使用的是一个毫无意义的。除非您有非常非常好的理由使用它,否则请避免使用dispatch\u sync

对于您的案例,这样的工作流程对我来说更有意义:

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可能在执行写入块之前更新,这就是UI看起来被放弃的原因;根据任务的执行时间表,上述想法将是任务之间更为同步的方式。

对于您的情况,这样的工作流对我来说更有意义:

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可能在执行写入块之前更新,这就是UI看起来被放弃的原因;根据任务的执行时间表,上述想法将是任务之间更为同步的方式。

对于您的情况,这样的工作流对我来说更有意义:

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可能在执行写入块之前更新,这就是UI看起来被放弃的原因;根据任务的执行时间表,上述想法将是任务之间更为同步的方式。

对于您的情况,这样的工作流对我来说更有意义:

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可能在执行写入块之前更新,这就是UI看起来被放弃的原因;根据任务的性能计划,上述想法将是任务之间更为同步的方式。

我没有编写代理的代码,因为我说在重新加载视图时它可以工作,但我有我的“CellForRowatineXpath”,它用结果的内容填充我的单元格。我的问题是,当我获取每个“对象”时,结果是空的,即使il在我的领域中的后台线程中写入。主线程不应该等到后台线程完成后再执行is work吗?我没有编写代理的代码,因为我说它在重新加载视图时起作用,但我有一个“cellforrowatinedexpath”,它用结果的内容填充我的单元格。我的问题是,当我获取每个“对象”时,结果是空的,即使il在我的领域中的后台线程中写入。主线程不应该等到后台线程完成后再执行is work吗?我没有编写代理的代码,因为我说它在重新加载视图时起作用,但我有一个“cellforrowatinedexpath”,它用结果的内容填充我的单元格。我的问题是,当我获取每个“对象”时,结果是空的,即使il在我的领域中的后台线程中写入。主线程不应该等到后台线程完成后再执行is work吗?我没有编写代理的代码,因为我说它在重新加载视图时起作用,但我有一个“cellforrowatinedexpath”,它用结果的内容填充我的单元格。我的问题是,当我获取每个“对象”时,结果是空的,即使il在我的领域中的后台线程中写入。主线程不应该等到后台线程完成后再执行is工作吗?谢谢你的回答,但它并没有解决我的问题。。Realm()。对象(objects)仍然返回空数组。该问题可能超出了您提供的代码段的范围,因为类
Realm
在此未知,你们为什么调用类级方法以及用这些对象填充的内容,这很奇怪,但你们肯定并没有填充实例级数组关于您已经在代码中正确地实现并使用了
Realm.framework
。尝试记录结果,而不是尝试存储结果,您将看到问题的确切位置。我将尝试这样做,谢谢。我也发现了这个:。这也许是解决办法,我会试试。谢谢你的回答,但它并没有解决我的问题。。Realm()对象(O