如何知道 NSData 是否完成下载以触发方法

How to know if NSData finished downloading to trigger a method

我正在地图上绘制标记,对于每个标记,我需要从 URL 下载特定图像,显然我需要执行此异步操作,但我需要知道下载时间在触发 addMarkerToMap () 之前完成,否则应用程序将崩溃,因为 NSData == nil.

我试过使用块,但 completionsuccess 响应在下载完成之前发送。我也尝试使用 NSURLSessionDelegate,但从未调用过委托方法。

如果有人可以帮助我或至少指导我找到实现此目标的可行方法。

谢谢,

编辑

这是我最后试过的代码,打印没有错误,addMarkerToMap(data) 没有被调用:

func downloadImageFromURL () {
    let config = NSURLSessionConfiguration.defaultSessionConfiguration()
    let session = NSURLSession (configuration: config)
    let task = session.dataTaskWithURL(self.markerURL!) { (data, response, error) -> Void in
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                if ((error != nil)) {
                    self.addMarkerToMap (data)
                } else {
                    print(error)
                }
            })

    }
}

应该是if error == nil或者

if error != nil {
  print(error!)
} else {
  self.addMarkerToMap(data!)
}

您必须调用resume(),否则任务将永远无法完成。

正如@vadian 所说,您必须重写为 if ((error == nil)),否则您的应用可能会在解包可选数据值时发现 nil 并崩溃。

所以,它会是这样的:

func downloadImageFromURL () {
  let config = NSURLSessionConfiguration.defaultSessionConfiguration()
  let session = NSURLSession (configuration: config)
  let task = session.dataTaskWithURL(self.markerURL!) { (data, response, error) -> Void in
    dispatch_async(dispatch_get_main_queue(), { () -> Void in
      if error == nil {
        self.addMarkerToMap(data)
      } else {
        print(error)
      }
    })
  }
  task.resume()
}