如何知道 NSData 是否完成下载以触发方法
How to know if NSData finished downloading to trigger a method
我正在地图上绘制标记,对于每个标记,我需要从 URL 下载特定图像,显然我需要执行此异步操作,但我需要知道下载时间在触发 addMarkerToMap ()
之前完成,否则应用程序将崩溃,因为 NSData == nil
.
我试过使用块,但 completion
或 success
响应在下载完成之前发送。我也尝试使用 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()
}
我正在地图上绘制标记,对于每个标记,我需要从 URL 下载特定图像,显然我需要执行此异步操作,但我需要知道下载时间在触发 addMarkerToMap ()
之前完成,否则应用程序将崩溃,因为 NSData == nil
.
我试过使用块,但 completion
或 success
响应在下载完成之前发送。我也尝试使用 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()
}