在完成块中识别NSURLSession

时间:2016-05-03 12:35:40

标签: ios swift subclassing

我想在didFinishDownloadingToURL方法中识别会话:

func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL)
{
    if (session.sessionType == EnumImageRequestSession)
    {

        // I want to check with sessionType, but NSURLSession does not have
        // any such property. How to add this type property while creating the session?
    }
    if (session.sessionType == EnumAudioRequestSession)
    {

    }
}

如何实现这一目标?我应该创建NSURLSession的子类并添加sessionType属性吗?

2 个答案:

答案 0 :(得分:1)

以下是我过去使用的一些选项。

  1. 启动NSURLSession时,可以将其添加到Dictionary或Set中,并使用与Session关联的键值。完成后,使用Set中的标识符查找Session,然后您将获得相关的密钥。

  2. 您可以查看与会话相关联的网址。

  3. 选项1是我迄今为止尝试过的方法,使用Set。

答案 1 :(得分:1)

由于NSURLSession是一个NSObject子类,您可以使用Objective-C关联对象,这样您就可以避免按类型管理例如会话的地图。必须创造。

这是一个简短的例子(我正在用强制解包切割一些角落,实际上我不会在生产导向代码中):

import Foundation
import ObjectiveC

enum SessionType:Int {
    case Audio
    case Image
}

func someFunctionWhereYouCreateTheSession() {
    let session:NSURLSession = NSURLSession()
    objc_setAssociatedObject(session, "sessionType",
                             NSNumber(integer:SessionType.Audio.rawValue), objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
}


func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL)
{
    let sessionType:SessionType = SessionType(rawValue:(objc_getAssociatedObject(session, "sessionType") as! NSNumber).integerValue)!

    switch sessionType {
    case .Audio:
        print("foo")

    case .Image:
        print("bar")
    }
}