1

我正在尝试通过NSProgress. 但是,当我设置totalUnitCountandcompletedUnitCount值时,这些根本不会在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

我目前不知道这里发生了什么,以及这是某种快速问题还是滥用NSProgressapi。

提前感谢您的帮助!

//编辑:尽管在 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任何地方都使用相同的实例!

4

0 回答 0