【问题标题】:Identify NSURLSession in completion block确定NSURLSession在完成块
【发布时间】:2016-05-03 12:35:40
【问题描述】:

我想在我的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 属性吗?

【问题讨论】:

    标签: ios swift subclassing


    【解决方案1】:

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

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

    2. 您可以查看与会话关联的 URL。

    到目前为止,选项 1 是我尝试过的真实方法,使用 Set。

    【讨论】:

    • 是的,你是对的。这些可能是解决方案。但我正在尝试创建 NsUrlSession 的子类并添加一个属性(sessionType)。现在我使用 nsurlSession 子类的新子类创建新会话,并将新值分配给添加的属性 (sessionType)。我假设委托何时调用,然后我将使用会话检查添加的属性(在 didFinishDownloadingToURL 方法中返回)。但是当我用新的子类创建一个新会话时,应用程序崩溃了。请建议我们可以通过添加属性来创建 nsurlsession 的子类吗?
    【解决方案2】:

    由于NSURLSessionNSObject 的子类,您可以使用一个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")
        }
    }
    

    【讨论】:

    • 感谢您的回复。我会试试这个。请建议我们是否可以通过创建 nsurlsession 的子类并向子类添加属性来执行此操作。当委托方法回调时,我们使用委托方法中返回的会话对象检查添加的属性?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多