Swift 2 - 防止加载大 gif 文件卡住



我有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

最新更新