iOS8 Swift TableView LoadingOverlay Grand Central Dispatch

iOS8 Swift TableView LoadingOverlay Grand Central Dispatch

我正在编写一个有多个 TableView 的应用程序。如果您单击第一个单元格,它会打开第二个具有特定参数的单元格。 对于其中的每一个,我都会从网站上解析一些内容,这通常需要一些时间。 我想让我的用户知道他们必须稍等一下,所以我写了一个 class ,在应用程序解析时我在其中覆盖了一个进度视图。 我的问题是,如果我尝试在解析之前启动它并在之后隐藏它,它会在内容完全解析之前被隐藏。

我尝试使用线程和中央调度,但没有成功。

我最后尝试的是这个:

    LoadingScreen.shared.showOverlay(self.view)
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
        self.parse()
    }
    LoadingScreen.shared.hideOverlayView()

LoadingScreen.shared.hideOverlayView() 总是调用得太早。有想法该怎么解决这个吗? :(

当您调用 hideOverlayView 时,解析尚未完成,因为您正在主线程上进行隐藏调用,而您的后台线程仍在执行解析。

您将希望在第一个 dispatch_async 块中分派回主线程。它看起来像这样:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {
    self.parse()

    dispatch_async(dispatch_get_main_queue()) {
        LoadingScreen.shared.hideOverlayView()
    }
}

这将等待解析完成,然后再分派回主线程以隐藏叠加层。

解决方案是为您的解析函数添加一个闭包,即:

func parse(_completion:(finished: Bool) -> Void) {
    // do your logic after finishing call your closure
    _completion(finished: true);

}

如果你想调用你的解析函数,你必须这样做:

parse { (finished) -> Void in
        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            // make your UI stuff after finishing parsing
        })
    }