2015-04-05 200 views
6

在手表上加载外部图像比下面更优雅的解决方案吗?从WatchKit上的URL加载图像

let image_url:String = "http://placehold.it/350x150" 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 
    let url:NSURL = NSURL(string:image_url)! 
    var data:NSData = NSData(contentsOfURL: url)! 
    var placeholder = UIImage(data: data)! 

    // update ui 
    dispatch_async(dispatch_get_main_queue()) { 
     self.imageView.setImage(placeholder) 
    } 
} 

回答

3

我认为解决方案很好,因为它可以帮助您的应用程序摆脱滞后,当你试图从网络加载一些图像。 你可以像这样的新功能:

func loadImage(url:String, forImageView: WKInterfaceImage) { 
// load image 
    let image_url:String = url 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 
     let url:NSURL = NSURL(string:image_url)! 
     var data:NSData = NSData(contentsOfURL: url)! 
     var placeholder = UIImage(data: data)! 

// update ui 
     dispatch_async(dispatch_get_main_queue()) { 
      forImageView.setImage(placeholder) 
     } 
    } 

} 

后,任何地方,你想从你urlString可以使用这样的加载图片:

loadImage("http://...", forImageView: self.myImageView) 

希望这有助于。

+0

THX。也许我们应该把它作为一个类别... – fabian 2015-04-05 19:29:07

+0

如何添加加载完成处理程序? – fabian 2015-04-06 16:32:55

4

这里是类

import WatchKit 

public extension WKInterfaceImage { 

    public func setImageWithUrl(url:String) -> WKInterfaceImage? { 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 
      let url:NSURL = NSURL(string:url)! 
      var data:NSData = NSData(contentsOfURL: url)! 
      var placeholder = UIImage(data: data)! 

      dispatch_async(dispatch_get_main_queue()) { 
       self.setImage(placeholder) 
      } 
     } 

     return self 
    } 

} 

使用方法如下

self.imageView.setImageWithUrl(image_url) 
0
 if let url = NSURL(string: "http://google.net/img/upload/photo2.png") { 
      if let data = NSData(contentsOfURL: url){ 

      imageWK.setImage(UIImage(data: data)) 

     } 
    } 

试试这个代码。 不要忘记在你的Plist中添加NSTransportSecurity。

+1

像其他人一样,这个解决方案在我的watchOS模拟器中工作正常,但没有在设备上。添加日志后,我看到第二个if语句返回false。我使用的图像,如果http://openweathermap.org/img/w/10d.png – 2015-12-01 10:20:32

+0

您可以尝试此异步图像加载: https://github.com/natelyman/SwiftImageLoader – 2015-12-01 11:17:15

+0

谢谢,我刚刚添加了另一个使用NSURLSession在模拟器和设备上正常工作的答案 – 2015-12-01 11:47:35

10

NSURL旨在用于本地文件。而是使用NSURLSession。为远程图像设置比例也很有用。

import WatchKit 

public extension WKInterfaceImage { 

    public func setImageWithUrl(url:String, scale: CGFloat = 1.0) -> WKInterfaceImage? { 

     NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: url)!) { data, response, error in 
      if (data != nil && error == nil) { 
       let image = UIImage(data: data!, scale: scale) 

       dispatch_async(dispatch_get_main_queue()) { 
        self.setImage(image) 
       } 
      } 
     }.resume() 

     return self 
    } 
} 

使用方法如下

self.imageView.setImageWithUrl(image_url, scale: 2.0) 
+3

这是正确的答案。除非使用NSURLSession,否则图像不会显示在设备上。 +1 – 2016-02-01 20:38:28

2

我认为这个解决方案可以存储在从缓存中缓存和显示图像的图像also.so你可以调用这个函数并使用它。

func loadImage(url:String, forImageView: WKInterfaceImage) { 

    forImageView.setImageNamed("placeholder") 
    let image_url:String = url 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 

     let url:NSURL = NSURL(string:image_url)! 
     print(url) 

     //if image is already stored in cache 
     if WKInterfaceDevice.currentDevice().cachedImages[image_url] != nil{ 
      dispatch_async(dispatch_get_main_queue()) { 
       forImageView.setImageNamed(image_url) 
      } 
     }else{ 
      if let data = NSData(contentsOfURL: url){ 

       //load image 
       let image = UIImage(data: data)! 
       //Store image in cache 
       WKInterfaceDevice.currentDevice().addCachedImage(image, name: image_url) 
       dispatch_async(dispatch_get_main_queue()) { 
        forImageView.setImage(placeholder) 
       } 
      } 
     } 
    } 
} 
0
public extension WKInterfaceImage { 

    public func setImageWithUrl(url:String, scale: CGFloat = 1.0) -> WKInterfaceImage? { 

     URLSession.shared.dataTask(with: NSURL(string: url)! as URL) { data, response, error in 
      if (data != nil && error == nil) { 
       let image = UIImage(data: data!, scale: scale) 

       DispatchQueue.main.async() { 
        self.setImage(image) 
       } 
     } 
     }.resume() 

    return self 
} 

}