在我的项目中,我正在访问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
}
所以我的问题是如何将执行时间限制在我的代码上。或者有什么方法可以让我的代码更有效率吗?
答案 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
}