使用addOperationWithBlock重新加载TableView

时间:2014-08-29 23:03:52

标签: ios swift nsoperationqueue

我正在尝试将我的tableView重新加载到一个块中,但我的插座总是为零。我有一个后台管理器,带有一个小的popover来显示当前的下载。一切正常,但我无法在下载时重新加载我的tableView(例如显示下载速度)。

我有一个简单的UITableView

插座
class FileDownloadHandlerViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, NSURLSessionDelegate, NSURLSessionDownloadDelegate {

    @IBOutlet var fileDownloadTable: UITableView!

//这是我的下载任务

func URLSession(session: NSURLSession!, downloadTask: NSURLSessionDownloadTask!, didFinishDownloadingToURL location: NSURL!) {

....

 if(success == true) {

        // Change the flag values of the respective FileDownloadInfo object

        let index:Int = self.getFileDownloadInfoIndexWithTaskIdentifier(downloadTask.taskIdentifier)

        let fdi = arrFileDownloadData.objectAtIndex(index) as FileDownloadInfo

        fdi.isDownloading = false
        fdi.downloadComplete = true
        fdi.taskIdentifier = -1
        fdi.taskResumeData = nil

        // Reload the respective table view row using the main thread.

        let indexPath = NSIndexPath(forRow: index, inSection: 0)

        println(indexPath)

        if(fileDownloadTable == nil)
        {
            println("still nil")
        }

        NSOperationQueue.mainQueue().addOperationWithBlock({

            if(self.fileDownloadTable == nil)
            {
                println("nil again")
            }

//This is the Problem. fileDownloadTable is always nil


            //self.fileDownloadTable.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.None)

        })

    } else {

        println("Unable to copy temp file. Error: \(error)")

    }

任何想法?我是否需要将我的奥特莱斯传递给这个街区?如果我使用这个DownloadController不在popover内(所以我仍然是我的mainViewController)一切正常。

提前致谢。

修改

Ok发现问题是我将NSUrlSessionConfiguration设置为FileDownloadClass之外的全局变量。

var session:NSURLSession!
var sessionConfiguration:NSURLSessionConfiguration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("com.company")

如果我在我的课堂上设置它,我可以重新加载tableView。但是,现在我关闭我的popover并加载其他东西时出现以下错误:

标识符为......的后台网址已存在!

如何检查是否已存在URLSession,还是将其设置为全局URLSession?

1 个答案:

答案 0 :(得分:0)

在ViewDidLoad中,添加

   [self backgroundSession];

然后添加此功能

 - (NSURLSession *)backgroundSession
    {
        static NSURLSession *session = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.iosDevelopment.VDownloader.SimpleBackgroundTransfer.BackgroundSession"];
            session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
        });

    return session;
}