2016-05-03 3 views
1

Я хочу, чтобы определить сессию в моем didFinishDownloadingToURL метода:Определение NSURLSession в блоке завершения

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?

ответ

1

Вот несколько вариантов, которые я использовал в прошлом.

  1. При запуске NSURLSession вы можете добавить его в словарь или установить с ключевым значением, связанным с сеансом. По завершении найдите сеанс, используя его идентификатор в наборе, а затем у вас будет свой связанный ключ.

  2. Вы можете проверить URL-адрес, связанный с сеансом.

Вариант 1 - мой испытанный метод до сих пор с использованием набора.

+0

Да вы правы .these может быть solution.But Я пытаюсь создайте подкласс NsUrlSession и добавьте свойство (sessionType). теперь я создаю новый сеанс с новым подклассом, который относится к подклассу nsurlSession и присваивает новое значение добавленному свойству (sessionType). и я предполагаю, что когда делегат будет вызывать, я проверю добавленное свойство с сеансом (возвращен методом didFinishDownloadingToURL). но когда я создаю новый сеанс с новым подклассом, приложение разбилось. Пожалуйста, предложите ли мы сделать это с созданием подкласса nsurlsession путем добавления свойства? – user100

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") 
    } 
} 
+0

спасибо за ответ. Я попробую это. Пожалуйста, предлагайте Не можем ли мы сделать это с созданием подкласса nsurlsession и добавлением свойства подкласса. и когда метод делегата обращается, мы проверяем добавленную собственность с объектом сеанса, возвращаемым в методе делегата? – user100

+0

Его работа с вашей идеей. пожалуйста, предложите с помощью подкласса ...... – user100

Смежные вопросы