我正在尝试通过NSProgress
. 但是,当我设置totalUnitCount
andcompletedUnitCount
值时,这些根本不会在NSProgress
对象上更新。
这就是我最初创建进度对象的方式:
let progressUserInfo: [ String: String ] = [
NSProgressFileOperationKindKey: NSProgressFileOperationKindDownloading,
]
let progress = NSProgress(parent: nil, userInfo: progressUserInfo)
progress.kind = NSProgressKindFile
progress.totalUnitCount = -1
progress.completedUnitCount = 0
然后我在下载管理器中保留这个进度对象的一个实例,并将它传递给触发下载的调用者。
现在,当我收到服务器响应时,我使用以下方法对其进行更新:
func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -> Void) {
progress.totalUnitCount = response.expectedContentLength
completionHandler(.Allow)
}
然后,每次我从服务器获取大量数据时,我都会更新进度:
func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {
progress.totalUnitCount = dataTask.countOfBytesExpectedToReceive
progress.completedUnitCount = dataTask.countOfBytesReceived
}
为了检查这是否有效,我为该fractionCompleted
属性添加了一个 KVO。每次我更新completedUnitCount
属性时都会触发这个观察者,但是,当检查进度对象上的值时,那里没有任何变化:
override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
let progress = object as NSProgress
println("loaded user: \(progress.localizedDescription) - \(progress.localizedAdditionalDescription) = \(progress.fractionCompleted)")
}
这总是输出loaded user: Downloading files… - = 0.0
我目前不知道这里发生了什么,以及这是某种快速问题还是滥用NSProgress
api。
提前感谢您的帮助!
//编辑:尽管在 Swift 中调试对我来说完全被破坏了,而且我不能po progress
在调试器中,但debugPrint()
在各个地方执行 a 时,我得到的输出如下:
<NSProgress: 0x7f9473520f20> : Parent: 0x0 / Fraction completed: 0.0000 / Completed: 0 of -1
<NSProgress: 0x7f9473520f20> : Parent: 0x0 / Fraction completed: 0.0000 / Completed: 0 of -1
<NSProgress: 0x7f9473520f20> : Parent: 0x0 / Fraction completed: 0.0000 / Completed: 0 of -1
所以我肯定在NSProgress
任何地方都使用相同的实例!