闭包内的 Swift NSURLSession 访问委托

Posted

技术标签:

【中文标题】闭包内的 Swift NSURLSession 访问委托【英文标题】:Swift NSURLSession access delegate within closure 【发布时间】:2015-06-25 06:18:25 【问题描述】:

我是 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()

一切正常,但我无法访问我的委托委托。我在这里错过了一些简单的东西吗?我一直在谷歌搜索,但问题是我不知道我不知道什么:/

感谢您的帮助。

编辑说明: 问题是在这种情况下 delegate 是零。这是因为我不明白遵守协议的类必须将委托设置为自身。这是链接到预期的协议实现的地方,这是我不明白的。

所以在实现协议的类中:

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

【问题讨论】:

【参考方案1】:

您的委托未定义。

您声明了var 类型的Optional<APIClientDelegate> 委托,但您从未设置它的值。如果你想让它工作,你的委托 var 需要指向一个满足协议中为APIClientDelegate 设置的要求的类。

【讨论】:

对不起,sn-p 有点老了,我已经更新了它,但它几乎是一样的。退后一步,我明白你的意思,但为什么这会起作用:github.com/tutsplus/SwiftFromScratch-ToDo-2/blob/master/ToDo/… AddItemViewController 实例是在某个地方创建的,很可能是在它创建的地方,它的委托属性也被设置。我推荐的是:在委托中创建您的类实例(例如在 viewDidLoad 中)。创建实例后,将其属性设置为 self : var instance = MyCoolClass() instance.delegate = self 在 prepareForSegue 方法中查看:github.com/tutsplus/SwiftFromScratch-ToDo-2/blob/master/ToDo/… 我明白了,所以遵守协议的类应该将委托设置为自己?这很重要,因为我想知道如何在委托调用和预期实现之间建立联系。 事实上这有效!谢谢你的解释!

以上是关于闭包内的 Swift NSURLSession 访问委托的主要内容,如果未能解决你的问题,请参考以下文章

NSURLSession,完成块,Swift

swift NSURLSession_Example.swift

swift NSURLSession + Synchronous.swift

swift NSURLSession + Synchronous.swift

带有 NSURLSession 的 Swift 中的 HTTP 请求

Swift 中这些 NSURLSession 方法的代表是啥?