2015-06-25 5 views
1

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

Это мой класс свойство

var delegate: APIClientDelegate? 

Вот соответствующий раздел

var configuration = NSURLSessionConfiguration.defaultSessionConfiguration() 

    var session = NSURLSession(configuration: configuration, delegate: self, delegateQueue:NSOperationQueue.mainQueue()) 

    var task = session.dataTaskWithRequest(request){ 
     (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in 
     if error == nil { 
      var result = NSString(data: data, encoding: NSASCIIStringEncoding)! 
      NSLog("request to %@ result %@", request.URLString, result) 
      if let delegate = self.delegate{ 
       delegate.requestDidSucceed(data) 
      } else { 
       println("nope") 
      } 
     } 
    } 
    task.resume() 

Это все работает нормально, но я не могу получить доступ к своему Делегат делегат. Я что-то пропустил здесь? Я давно искал поисковые запросы, но проблема в том, что я не знаю, что я не знаю:/

Благодарим за помощь.

EDIT ОБЪЯСНЕНИЕ: Вопрос заключается в том, что в этом контексте делегата был равен нулю. Это произошло потому, что я не понимал, что класс, который придерживается протокола, должен установить делегат сам. Здесь и делается ссылка на предполагаемую реализацию протокола, и я этого не понимаю.

Таким образом, в классе, который реализует протокол:

var apiClient: APIClient = APIClient() 
apiClient.delegate = self 

ответ

0

Ваш делегат не определен.

Вы объявляете делегата var типа Optional<APIClientDelegate>, но вы никогда не устанавливаете его значение. Если вы хотите, чтобы он работал, вы делегируете var, чтобы указать класс, который заполняет требования, установленные в протоколе для APIClientDelegate.

+0

Извините, что фрагмент немного старый, я его обновил, но он в основном такой же. Возвращаясь назад, я вижу вашу точку зрения, но почему тогда это работает: https://github.com/tutsplus/SwiftFromScratch-ToDo-2/blob/master/ToDo/AddItemViewController.swift – lampwins

+0

Экземпляр AddItemViewController создается где-то, скорее всего, где он также создает свое свойство делегирования. Я рекомендую: создать экземпляр класса в делегате (например, в viewDidLoad). После того, как вы создали свой экземпляр, установите его свойство для себя: var instance = MyCoolClass() instance.delegate = self –

+0

См. Здесь: https://github.com/tutsplus/SwiftFromScratch-ToDo-2/blob/master/ ToDo/ViewController.swift в методе prepareForSegue –

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