等待在Swift中完成异步操作

Pre*_*sus 23 asynchronous ios swift

我不知道如何处理这种情况,因为我是iOS开发和Swift的新手.我正在执行数据提取,如下所示:

func application(application: UIApplication!, performFetchWithCompletionHandler completionHandler: ((UIBackgroundFetchResult) -> Void)!)
{
    loadShows()
    completionHandler(UIBackgroundFetchResult.NewData)
    println("Background Fetch Complete")
}
Run Code Online (Sandbox Code Playgroud)

我的loadShows()函数解析从加载到UIWebView的网站获得的一堆数据.问题是我有一个在loadShows函数中等待10秒左右的计时器.这允许在我开始解析数据之前完全加载页面中的javascript.我的问题是完成处理程序在我的loadShows()之前完成.

我想要做的是为"isCompletedParsingShows"添加一个bool,并使completionHandler行等待完成,直到该bool为真.处理这个问题的最佳方法是什么?

Dai*_*jan 33

您必须将您的异步函数传递给稍后调用的处理程序:

func application(application: UIApplication!, performFetchWithCompletionHandler completionHandler: ((UIBackgroundFetchResult) -> Void)!) {
    loadShows(completionHandler)
}

func loadShows(completionHandler: ((UIBackgroundFetchResult) -> Void)!) {
    //....
    //DO IT
    //....

    completionHandler(UIBackgroundFetchResult.NewData)
    println("Background Fetch Complete")
}
Run Code Online (Sandbox Code Playgroud)

或(清洁方式恕我直言)

添加一个中间completionHandler

func application(application: UIApplication!, performFetchWithCompletionHandler completionHandler: ((UIBackgroundFetchResult) -> Void)!) {
    loadShows() {
        completionHandler(UIBackgroundFetchResult.NewData)
        println("Background Fetch Complete")
    }
}

func loadShows(completionHandler: (() -> Void)!) {
    //....
    //DO IT
    //....
    completionHandler()
}
Run Code Online (Sandbox Code Playgroud)

  • 这个功能是如何使用的?你能提供一个例子吗? (6认同)