我想在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
属性吗?
答案 0 :(得分:1)
以下是我过去使用的一些选项。
启动NSURLSession时,可以将其添加到Dictionary或Set中,并使用与Session关联的键值。完成后,使用Set中的标识符查找Session,然后您将获得相关的密钥。
您可以查看与会话相关联的网址。
选项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")
}
}