将回调添加到预构建的异步函数Swift iOS

时间:2016-06-13 22:56:49

标签: ios swift asynchronous

此刻我正在搞乱pdf。我正在尝试将PDF加载到系统中并写出相同的PDF以获得对整个过程的理解。

我遇到的问题是我不得不从网上加载pdf,因为WebViewUI.loadRequest是异步的,所以没有及时完成。

    override func viewDidLoad() {
        super.viewDidLoad()

        let filePath = getDocumentsDirectory().stringByAppendingPathComponent("output.pdf")

        let url : NSURL! = NSURL(string: "http://www.nhs.uk/NHSEngland/Healthcosts/Documents/2014/HC5(T)%20June%202014.pdf")

        loadTemplate(url, completion: {(webView: UIWebView) -> Void in
            print("callback started")
            let pdf = self.toPDF(webView)

            do {
                pdf!.writeToFile(filePath, atomically: true)
            } catch {
                // failed to write file – bad permissions, bad filename, missing permissions, or more likely it can't be converted to the encoding
            }

            print("callback started")

        })

        print("Finished viewDidLoad")

    }

    func loadTemplate(url: NSURL, completion: (webView: UIWebView) -> Void) {
        print("Start loadTemplate")
        // do some crunching to create the SketchAnimation instance...
        let webView = UIWebView(frame: CGRectMake(20, 100, 300, 40))
        webView.loadRequest(NSURLRequest(URL: url))

        self.view.addSubview(webView)

        // invoke the completion callback
        completion(webView: webView)

        print("finished loadTemplate")
    }

如何将回调添加到loadRequest而不是loadTemplate?

1 个答案:

答案 0 :(得分:0)

你完全没有。您将视图控制器设置为Web视图的委托并实施webViewDidFinishLoad方法。在该方法中,您需要检查以确保完成的加载是您所使用的加载,如果是,那么您在加载完成时调用了要运行的代码。

以下是如何进行设置的基本示例:

//
//  ViewController.swift
//

import UIKit

class ViewController: UIViewController, UIWebViewDelegate {

    @IBOutlet var webView: UIWebView!

    var url = NSURL(string: "http://google.com")

    override func viewDidLoad() {
        super.viewDidLoad()

        //load initial URL
        let req = NSURLRequest(URL : url!)
        webView.delegate = self
        webView.loadRequest(req)
    }

    func webViewDidStartLoad(webView : UIWebView) {
        print("AA")
    }

    func webViewDidFinishLoad(webView : UIWebView) {
        print("BB")
    }

}