解雇ViewController时下载停止

时间:2016-07-23 13:01:01

标签: ios swift nsurlsessiondownloadtask

我正在使用Cheapjack Library (iOS)在Swift中的应用程序中下载文件。我从另一个类排队下载。这似乎工作正常,下载排队并开始下载。但是,当下载发生的“DownloadsViewController”未显示时,文件完成下载时不会执行didiFinishDownload块。关于如何处理我的错误的任何想法。 此外,当我打开下载ViewController并将其关闭时,下载会在我解除ViewController时停止。  有什么想法吗?

这是我的代码:

//Adding download from another class
let downloadItem = DownloadsTableViewCellItem(identifier: identifier, urlString: url3, infoLabelTitle: info, stateLabelTitle: "Downloading...", progressLabelTitle: "", action: DownloadsTableViewCellAction.Pause)
        DownloadsViewController().addDownloadItem(downloadItem, withIdentifier: identifier)

//Receiving download in DownloadsViewController
func addDownloadItem(downloadItem: DownloadsTableViewCellItem, withIdentifier identifier: CheapjackFile.Identifier) {

        downloadItems[identifier] = downloadItem
        identifiers.append(identifier)

        CheapjackManager.sharedManager.download(downloadItem.url(), identifier: identifier)
        self.tableView.reloadData()

    }

//DidFinishBlock
func cheapjackManager(manager: CheapjackManager, didFinishDownloading withSession: NSURLSession, downloadTask: NSURLSessionDownloadTask, url: NSURL, forFile file: CheapjackFile) {
        dispatch_async(dispatch_get_main_queue()) {
        print("Did finish downloading file")
        SongsTableViewController().tableView.reloadData()

            let filemanager = NSFileManager.defaultManager()
            let documentsPath : AnyObject = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,.UserDomainMask,true)[0]
            print("DocumentsPath: \(documentsPath)")
        let randomUUID: String = NSUUID().UUIDString + ".mp3"
        let destinationPath = documentsPath.stringByAppendingString("/" + randomUUID)
            print("DestinationPath: \(destinationPath)")


            if (!filemanager.fileExistsAtPath(destinationPath as String)) {

                let url1 = file.request.URL
                print("URL1: \(url1)")
                print("Temp Loc: \(String(url))")

                let data = NSData(contentsOfURL: url)

                if (data != nil) {



                        data!.writeToFile(destinationPath, atomically: false)
                       //data!.writeToURL(NSURL(string:destinationPath)!, atomically: false)

                            print("The music files has been saved.")


                        let appDel: AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate)

                        let fetchRequest = NSFetchRequest(entityName: "Track")
                        fetchRequest.predicate = NSPredicate(format: "url = %@", String(url1!))

                        let context = appDel.managedObjectContext

                        do {

                            let results = try context.executeFetchRequest(fetchRequest)

                            fetchResults = results as! [NSManagedObject]

                            if fetchResults.count != 0 {

                                let managedObject = fetchResults[0]
                                managedObject.setValue(destinationPath, forKey: "fileURL")

                                appDel.saveContext()

                                SongsTableViewController().fetchData()

                            } else {

                                print("No track found")
                            }

                        } catch let error as NSError {
                            print("Could not fetch \(error), \(error.userInfo)")
                    }

                }
            } else {
                print("The files already exist")
            }
        }
}

1 个答案:

答案 0 :(得分:1)

如果你解雇它,

DownloadsViewController会被删除。

请注意delegate的{​​{1}}为CheapjackManager。解雇weak后,DownloadsViewController将设置为nil,对delegate的任何调用都将被忽略,包括delegate

与此同时,cheapjackManager:didiFinishDownload:仍在为您下载资源。只是无法在CheapjackManager中观察到它。