使用 NSURLSession 下载后,将图像设置为对象
Set image to object, after downloading with NSURLSession
我有 7 个汽车对象,每个对象我都需要下载汽车图像并将其设置为汽车对象。
下载完成后,我在 didFinishDownloadingToURL 函数中检索图像,我有两个选择:1。直接从临时文件 2.move 文件加载图像到另一个位置并将其保存在目录中(例如)。
问题是我不知道如何将这个检索到的图像设置为相应的对象!!!
如果我使用第一个选项,我怎样才能找到好的和相应的对象来设置图像??
或者如果我使用第二个选项:将文件保存到目录,我怎样才能找到相应的图像文件并将其设置为相应的对象?
实际上我使用 NSURLSession 从不同的 url 下载图像。
为此,我有管理 URLSession 回调的 DownloadSessionDelegate。在这里你可以找到我的 class:
typealias CompleteHandlerBlock = () -> ()
class DownloadSessionDelegate: NSObject, NSURLSessionDelegate, NSURLSessionDownloadDelegate {
var handlerQueue : [String : CompleteHandlerBlock]!
class var sharedInstance:DownloadSessionDelegate {
struct Static {
static var instance :DownloadSessionDelegate?
static var token : dispatch_once_t = 0 ;
}
dispatch_once(&Static.token) {
Static.instance = DownloadSessionDelegate();
Static.instance!.handlerQueue = [String : CompleteHandlerBlock]();
}
return Static.instance!
}
// Session delegate
func URLSession(session: NSURLSession, didBecomeInvalidWithError error: NSError?) {
println("session error: \(error?.localizedDescription).")
}
func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential!) -> Void) {
completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential, NSURLCredential(forTrust: challenge.protectionSpace.serverTrust))
}
func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) {
println("session \(session) has finished the download task \(downloadTask) of URL \(location).")
var fileHandle:NSFileHandle = NSFileHandle(forReadingAtPath: location.path!)!
var data:NSData = fileHandle.readDataToEndOfFile()
var image:UIImage = UIImage(data: data)! }
我也输入了 handleEventsForBackgroundURLSession int AppDelegate,一切正常。
我只有一个 class:UIImageUtils,我在其中调用了 DownloadImage 函数。每个不同的 class 都调用此功能来下载他们的图像。在这里你可以找到这个功能:
// Download image
static func downloadImageFromUrl(urlImage:NSString, writeToDevice: Bool, storeName:NSString, object: AnyObject) {
var configuration = NSURLSessionConfiguration.backgroundSessionConfiguration(SessionProperties.identifier);
var backgroundSession = NSURLSession(configuration: configuration, delegate: DownloadSessionDelegate.sharedInstance, delegateQueue: nil);
var url = NSURLRequest(URL: NSURL(string: ConfigurationManager.host + urlImage)!);
var downloadTask = backgroundSession.downloadTaskWithRequest(url);
downloadTask.resume();
}
非常感谢您的帮助。
而不是费力地使用委托。您可以使用 downloadTaskWithRequest
方法的完成块。
我已经修改了 downloadImageFromUrl 函数来阻止。可以从您的汽车对象调用此函数,以便您在那个实例中得到回调。
func downloadImageFromUrl(urlImage:NSString, writeToDevice: Bool, storeName:NSString, object: AnyObject, onfinished:(UIImage) -> ()) {
var configuration = NSURLSessionConfiguration.backgroundSessionConfiguration(SessionProperties.identifier);
var backgroundSession = NSURLSession(configuration: configuration, delegate: DownloadSessionDelegate.sharedInstance, delegateQueue: nil);
var url = NSURLRequest(URL: NSURL(string: ConfigurationManager.host + urlImage)!);
var downloadTask = backgroundSession.dataTaskWithRequest(url, completionHandler: {
data,response,error in
if error == nil
{
if let image = UIImage(data: data)
{
dispatch_async(dispatch_get_main_queue(), { () -> Void in
onfinished(image)
})
}
}
})
downloadTask.resume();
}
车内class
class Car
{
func downloadImage
{
YourDelegate.downloadImageFromUrl(self.imageUrl, writeToDevice: true, storeName: "store", object: nil, onfinished: { downloadedImage in
self.image = downloadedImage
})
}
}
我有 7 个汽车对象,每个对象我都需要下载汽车图像并将其设置为汽车对象。
下载完成后,我在 didFinishDownloadingToURL 函数中检索图像,我有两个选择:1。直接从临时文件 2.move 文件加载图像到另一个位置并将其保存在目录中(例如)。
问题是我不知道如何将这个检索到的图像设置为相应的对象!!! 如果我使用第一个选项,我怎样才能找到好的和相应的对象来设置图像??
或者如果我使用第二个选项:将文件保存到目录,我怎样才能找到相应的图像文件并将其设置为相应的对象?
实际上我使用 NSURLSession 从不同的 url 下载图像。 为此,我有管理 URLSession 回调的 DownloadSessionDelegate。在这里你可以找到我的 class:
typealias CompleteHandlerBlock = () -> ()
class DownloadSessionDelegate: NSObject, NSURLSessionDelegate, NSURLSessionDownloadDelegate {
var handlerQueue : [String : CompleteHandlerBlock]!
class var sharedInstance:DownloadSessionDelegate {
struct Static {
static var instance :DownloadSessionDelegate?
static var token : dispatch_once_t = 0 ;
}
dispatch_once(&Static.token) {
Static.instance = DownloadSessionDelegate();
Static.instance!.handlerQueue = [String : CompleteHandlerBlock]();
}
return Static.instance!
}
// Session delegate
func URLSession(session: NSURLSession, didBecomeInvalidWithError error: NSError?) {
println("session error: \(error?.localizedDescription).")
}
func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential!) -> Void) {
completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential, NSURLCredential(forTrust: challenge.protectionSpace.serverTrust))
}
func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) {
println("session \(session) has finished the download task \(downloadTask) of URL \(location).")
var fileHandle:NSFileHandle = NSFileHandle(forReadingAtPath: location.path!)!
var data:NSData = fileHandle.readDataToEndOfFile()
var image:UIImage = UIImage(data: data)! }
我也输入了 handleEventsForBackgroundURLSession int AppDelegate,一切正常。
我只有一个 class:UIImageUtils,我在其中调用了 DownloadImage 函数。每个不同的 class 都调用此功能来下载他们的图像。在这里你可以找到这个功能:
// Download image
static func downloadImageFromUrl(urlImage:NSString, writeToDevice: Bool, storeName:NSString, object: AnyObject) {
var configuration = NSURLSessionConfiguration.backgroundSessionConfiguration(SessionProperties.identifier);
var backgroundSession = NSURLSession(configuration: configuration, delegate: DownloadSessionDelegate.sharedInstance, delegateQueue: nil);
var url = NSURLRequest(URL: NSURL(string: ConfigurationManager.host + urlImage)!);
var downloadTask = backgroundSession.downloadTaskWithRequest(url);
downloadTask.resume();
}
非常感谢您的帮助。
而不是费力地使用委托。您可以使用 downloadTaskWithRequest
方法的完成块。
我已经修改了 downloadImageFromUrl 函数来阻止。可以从您的汽车对象调用此函数,以便您在那个实例中得到回调。
func downloadImageFromUrl(urlImage:NSString, writeToDevice: Bool, storeName:NSString, object: AnyObject, onfinished:(UIImage) -> ()) {
var configuration = NSURLSessionConfiguration.backgroundSessionConfiguration(SessionProperties.identifier);
var backgroundSession = NSURLSession(configuration: configuration, delegate: DownloadSessionDelegate.sharedInstance, delegateQueue: nil);
var url = NSURLRequest(URL: NSURL(string: ConfigurationManager.host + urlImage)!);
var downloadTask = backgroundSession.dataTaskWithRequest(url, completionHandler: {
data,response,error in
if error == nil
{
if let image = UIImage(data: data)
{
dispatch_async(dispatch_get_main_queue(), { () -> Void in
onfinished(image)
})
}
}
})
downloadTask.resume();
}
车内class
class Car
{
func downloadImage
{
YourDelegate.downloadImageFromUrl(self.imageUrl, writeToDevice: true, storeName: "store", object: nil, onfinished: { downloadedImage in
self.image = downloadedImage
})
}
}