我有2MB的GIF文件,但是当我使用celluar并且我的高速结束时,我有15kb/s,我必须等待一定的时间才能继续使用该应用程序。
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
getGif()
}
func getGif(){
dispatch_async(dispatch_get_main_queue(), {
do{
if let json = try NSJSONSerialization.JSONObjectWithData(NSData(contentsOfURL: NSURL(string: "http://google.bg/gif.php")!)!, options: .MutableContainers) as? NSArray{
self.gifUrl = json[0]["url"] as! String
self.theGif.image = UIImage.gifWithURL(self.gifUrl)
}
}catch{}
})
}
调度不起作用...
如何在加载图像时继续使用该应用程序?
离开主线程执行下载,然后进入主线程与接口通信:
func getGif(){
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)), {
do{
if let json = try NSJSONSerialization.JSONObjectWithData(NSData(contentsOfURL: NSURL(string: "http://google.bg/gif.php")!)!, options: .MutableContainers) as? NSArray{
dispatch_async(dispatch_get_main_queue(), {
self.gifUrl = json[0]["url"] as! String
self.theGif.image = UIImage.gifWithURL(self.gifUrl)
}
}
}catch{}
})
}
但是,正如您被告知的那样,最好使用 NSURLSession 进行适当的下载。
extension UIImage {
public class func gifWithURL(gifUrl:String, completion: (data: NSData)->()) {
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithURL(NSURL(string: gifUrl)!) { (data, response, error) in
if error == nil {
dispatch_async(dispatch_get_main_queue(), {
completion(data: data!)
})
}
}
task.resume()
}
}
您在主队列上使用dispatch_async,以便在主线程上执行代码。
请尝试dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0))
。
还有一些不错的库可以隐藏GCD的复杂性,例如Async。如果您需要有关GCD本身的更多信息,请随时查看Apple Doc