Swift,NSOperationQueue.mainQueue():在操作运行期间更新操作中的数据?

时间:2014-10-17 18:19:24

标签: ios xcode swift nsoperationqueue

我在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()的数据?

1 个答案:

答案 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)

        }
    }
}