在获取信息时防止我的功能阻塞功能

Keep my function from blocking functionality while getting info

我有一个带有完成处理程序的函数,可以从 youtube API 下载视频。

在第一个 运行 上,效果很好。在随后的 运行 秒中,由于视频存储在设备中,并在更新视频数组之前显示,我希望用户能够与 table 进行交互,而它是更新(如果需要)。但是,在下载信息时,与 table 或应用程序的交互被阻止。

我猜这与Grand Central Dispatch有关,但我不知道如何使用它。

    Networking().getPlaylists() { (result: String) -> () in
        self.activityView.removeFromSuperview()
        print("should reload data")
        self.tableView.reloadData()
        }
    }

有人可以指点一下吗?

理想情况下,您的网络代码将在后台线程上执行:

func getPlaylists() {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
        //Do network stuff
    })
}

而且在调用完成之前,请确保在执行 UI 逻辑(如更新 tableview)之前先返回到主线程:

func getPlaylists() {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
        //Do network stuff
        dispatch_async(dispatch_get_main_queue()) {
            completion(results)
        }

    })
}

实际上不是 Alamofire 阻塞了我的 UI(它实际上是一个异步函数),而是在我解析时是 SwiftyJSON。我通过 dispatching_async 解决了它,但在解析部分而不是函数的其余部分!

在此处查看更多信息:

谢谢!