我在IOS项目中使用后台文件下载,并且当文件下载开始时,进度视图的更新由块NSOperationQueue.mainQueue().addOperationWithBlock()
在方法中启动:
func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
if totalBytesExpectedToWrite == NSURLSessionTransferSizeUnknown {
println("Unknown transfer size");
}
else{
let data = getDBInfoWithTaskIdentifier(downloadTask.taskIdentifier)
NSOperationQueue.mainQueue().addOperationWithBlock(){
data.db_info.downloadProgress = Float(totalBytesWritten) / Float(totalBytesExpectedToWrite)
let inf = data.db_info.indexPath
let cell = self.tableView.cellForRowAtIndexPath(NSIndexPath(forRow: data.index, inSection: 0)) as SettingsTableViewCell
cell.downloadProgress.hidden = false
cell.downloadProgress.setProgress(data.db_info.downloadProgress, animated: true)
}
}
}
当带有下载UI的视图被取消并再次出现时,self.tableView
是新对象,但self.tableView
操作中的NSOperationQueue.mainQueue()
更新进度视图是旧的,那是什么在解雇之前。 Println()返回两个不同的对象。是否有可能更新self.tableView
块中NSOperationQueue.mainQueue()
的数据?
答案 0 :(得分:0)
首先,您应该考虑切换到GCD(Grand Central Dispatch)。
出现问题是因为在关闭中捕获了对tableView
的引用。您可以考虑将逻辑放在单独的类函数中,以便在闭包中不显示tableView
。它具有更清晰,更有条理的代码的额外好处。
这是一个大致的想法:
// new function
func setProgressInCell (data:?) { // '?' because i do not know the type
let inf = data.db_info.indexPath
let cell = self.tableView.cellForRowAtIndexPath(NSIndexPath(forRow: data.index, inSection: 0)) as SettingsTableViewCell
cell.downloadProgress.hidden = false
cell.downloadProgress.setProgress(data.db_info.downloadProgress, animated: true)
}
func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
if totalBytesExpectedToWrite == NSURLSessionTransferSizeUnknown {
println("Unknown transfer size");
}
else{
let data = getDBInfoWithTaskIdentifier(downloadTask.taskIdentifier)
dispatch_async(dispatch_get_main_queue()) {
[weak self] in
data.db_info.downloadProgress = Float(totalBytesWritten) / Float(totalBytesExpectedToWrite)
self.setProgressInCell(data)
}
}
}