【问题标题】:Delegate methods not called in implementation of NSURLSessionDataNSURLSessionData 实现中未调用委托方法
【发布时间】:2015-07-04 06:47:29
【问题描述】:

我有一个班级,AWSUtil,我希望能够使用NSURLSessions获得图片上传和下载的进度

class AWSUtil : NSObject, NSURLSessionDelegate, NSURLSessionDownloadDelegate

我能够设置会话,并且它们可以工作

func sessionTest(url: NSURL){
    let task = NSURLSession(
        configuration: NSURLSessionConfiguration.defaultSessionConfiguration(),
        delegate: self,
        delegateQueue: NSOperationQueue.mainQueue()
    ).dataTaskWithURL(url){(data, response, error) in
        //code   
    }

    task!.resume()
}

但我的问题是委托方法,例如 NSURLSession didWriteData 没有被调用。

func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64){
    //never called
}

我尝试实现不同的NSURLSession 协议并使类不符合NSObject,但都不起作用。无论我实现了哪些委托,或者我在类中放置了哪些委托方法,都不会调用它们。

我认为这是因为对象在被调用之前就被释放了,但我不确定。如果我想调用其中一个函数,我会使用

func awsTest(url: NSURL){
    let aws = AWSUtil()
    aws.sessionTest(url)
}

但是没有一个NSURLSessionDownloadDelegate 方法被调用。有没有办法解决这个问题,或者有解决方法吗?

【问题讨论】:

  • didWriteDataNSURLSessionDownloadDelegate 而不是 NSURLSessionDataDelegate 的委托方法。
  • @0x141E 所有委托方法都会发生同样的事情,即使我实现了NSURLSessionDownloadDelegate。我在问题中澄清了这一点
  • 添加deinit 方法,并在其上设置断点。这样你就可以知道你的对象是否被释放了。
  • 您是否尝试过不提供完成处理程序?我认为它要么调用委托方法,要么调用完成处理程序。
  • @luk2302 我也必须这样做才能解决问题。您可能想发布一个答案。谢谢

标签: ios swift swift2


【解决方案1】:

你打电话给dataTaskWithURL。这是一种数据任务方法。数据任务有一个称为NSURLSessionDataDelegate 的协议。覆盖这些方法,例如URLSession:dataTask:...

didWriteData在使用下载方法时被调用,例如downloadTaskWithURL:,而你没有调用下载方法。

如果您查看https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSession_class/#//apple_ref/occ/instm/NSURLSession/downloadTaskWithURL:,您会在左侧的内容区域中看到数据、下载和上传任务是分开划分的。每个都有对应的委托方法。

【讨论】:

  • 谢谢!问题是我使用的是dataTaskWithURL 而不是downloadTaskWithURL。此外,我必须从调用中删除完成处理程序。
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
  • 2015-06-09
  • 2016-07-16
相关资源
最近更新 更多