我们可以避免在Safari中打开应用程序的webView内存问题吗?

时间:2016-02-12 08:44:08

标签: ios swift uiwebview

在我的应用中,按钮会将(带有网址链接)分段到包含UIViewController的新webView。这很好用。但问题是,一旦用户开始点击webView内的多个链接,内存使用量开始增加,并且继续增长,它会达到超过300mb且我的应用程序崩溃的程度。

我想知道如何处理这个问题?有没有更好的方法来处理webView中的内存问题?或者有没有办法在safari浏览器中打开链接,并在顶部有一个小的返回按钮,可以回到我的应用程序?这会解决我的应用程序的内存问题吗?如果是,我该如何编码?

目前我在UIViewController内使用包含webView的标准代码,如下所示:

var productUrl: String? // Received from previous ViewController segue

Override func viewDidLoad() {

 // Enable zoomIn/Out option for users
    webView.scalesPageToFit = true
    webView.delegate = self

    // Validate URL
    NSURL.validateUrl(productUrl!, completion: { (success, urlString, error) -> Void in
        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            if (success) {
                print("Success")
                self.url = NSURL (string: urlString!)
                let requestObj = NSURLRequest(URL: self.url!);
                self.webView.loadRequest(requestObj);
            }
            else {
                print("Fail")
            }
        })
    })
}

    func webViewDidStartLoad(webView: UIWebView) {

    UIApplication.sharedApplication().networkActivityIndicatorVisible = true
    activityIndicator.startAnimating()
    funcToCallWhenStartLoadingYourWebview()

}

func webViewDidFinishLoad(webView: UIWebView) {
    UIApplication.sharedApplication().networkActivityIndicatorVisible = false
    activityIndicator.stopAnimating()
    funcToCallCalledWhenUIWebViewFinishesLoading()
}

1 个答案:

答案 0 :(得分:1)

很少有教程可以帮助您解决这个问题。尝试在appcoda上查看来自Joyce Echessa的非常好的WebKit教程。这将帮助您解决问题。

您在Joyce Echessa的教程中必须处理的另一件事是,当您从webKit视图切换回其他视图时,您将收到崩溃,因为教程不包括删除已注册观察者的方法。但是这可以通过使用下面的代码解决(删除“loading”和“estimatedProgress”键路径。我不在这里描述,因为对于可能在其上努力工作的Joyce Echessa来说这是不公平的。所以你会一旦你看到教程,就会有更好的想法,因为它有详细记录。

测试完教程并遇到崩溃后,请尝试使用以下代码删除viewDidDissapear块中创建的观察者。

 override func viewWillDisappear(animated: Bool) {
    if (webView.loading) {
        webView.stopLoading()
    }
    progressView.setProgress(0.0, animated: false)
    webView.removeObserver(self, forKeyPath: "estimatedProgress")
    webView.removeObserver(self, forKeyPath: "loading")

    webView.navigationDelegate = nil
    webView.UIDelegate = nil
}
相关问题