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
})
}
我正在编写一个有多个 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
})
}