如何设置功能的时间限制?

时间:2016-03-22 08:56:27

标签: ios swift2 nstimer nsdata

在我的项目中,我正在访问URL中的图像。在这些URL中,我给了2-3个虚拟URL,它没有任何数据。但我的代码需要更多时间来访问&标识网址上没有imageData。这是代码

func callImageURL(urlString : String) -> UIImage
{


    // define an image
    var contentImage : UIImage = UIImage(named: "defaultImage.jpg")!

    // convert String url to NSURL
    let url = NSURL(string: urlString)

    // if url exist
    if (url != nil)
    {
        // fetch the imageData from url
        let data = NSData(contentsOfURL: url!)

        // if image data exist
        if (data != nil)
        {
            // convert imagedata back to an image
            contentImage = UIImage(data: data!)!
        }
    }


    return contentImage
}

所以我的问题是如何将执行时间限制在我的代码上。或者有什么方法可以让我的代码更有效率吗?

2 个答案:

答案 0 :(得分:1)

 NSData(contentsOfURL: url!)

是一个同步请求,所以它会阻塞你的主线程,直到它执行。也没有错误检查,可能是您的网址是404或者可能只是timeout,在这种情况下它可能会在4秒内轻松阻止您的主线程。

  

最佳做法是使用新的NSURLSession API下载图像   异步。这样,您也可以缓存请求   检查适当的错误回调而不阻止你的主要   线程。

我建议您查看Alamofire,它可以帮助您处理网络请求甚至进度块。

答案 1 :(得分:0)

如果您有一些耗时的功能,可以在后台线程中调用它们,然后在主线程上更新UI。 代码示例:

func callImageURL(urlString : String, completion: UIImage -> Void) {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
        var contentImage = UIImage(named: "defaultImage.jpg")

        if let url = NSURL(string: urlString), data = NSData(contentsOfURL: url)  {
            contentImage = UIImage(data: data)
        }

        dispatch_async(dispatch_get_main_queue()) {
            completion(contentImage!)
        }
    }
}

callImageURL("your url") {image in
    //Use your image
}