ios - 使用 NSURLSession 下载后,将图像设置为对象

标签 ios image swift nsurlsession

我有 7 个汽车对象,每个我都需要下载汽车图像并将其设置为汽车对象。

一旦下载完成并且我在 didFinishDownloadingToURL 函数中检索图像,我有两个选择:1。直接从临时文件加载图像 2. 将文件移动到另一个位置并将其保存在目录中(例如)。

问题是我不知道如何将这个检索到的图像设置为相应的对象!!! 如果我使用第一个选项,我怎样才能找到好的和相应的对象来设置图像??

或者如果我使用第二个选项:将文件保存到目录,我如何找到相应的图像文件并将其设置为相应的对象?

实际上我使用 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,一切正常。

我只有一个类: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();

}

非常感谢您的帮助。

最佳答案

而不是费力地使用委托(delegate)。您可以使用 downloadTaskWithRequest 方法的完成 block 。 我已经修改了 downloadImageFromUrl 函数来阻止。可以从您的 car 对象调用此函数,以便您将在该实例中得到回调。

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 Car
{
    func downloadImage
    {
        YourDelegate.downloadImageFromUrl(self.imageUrl, writeToDevice: true, storeName: "store", object: nil, onfinished: { downloadedImage in
            self.image = downloadedImage
        })
    }
}

关于ios - 使用 NSURLSession 下载后,将图像设置为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27925489/

相关文章:

ios - 如何在 Swift 中使用 UIDatePicker?

ios - 我仍然可以恢复已从 iTunes Connect 禁用的应用内购买吗?

ios - 使用 EC key 签名时 SecKeyRawSign 返回 -50

java - 除非调整窗口大小,否则组件不会显示 - Java

css - 独立于蒙版的动画图像?

ios - 将捕获的图像存储到 UIImage 数组中 (AVFoundation)

swift - 将字典数组转换为集合 Swift 4

uitableview - 如何将 TableViewCell 附加到 Swift 中的特定部分

ios - Swift - 如何过滤多维数组

c# - 在 WPF 中操作图像控件