关闭 ViewController 时下载停止

Posted

技术标签:

【中文标题】关闭 ViewController 时下载停止【英文标题】:Download Stops When Dismissing ViewController 【发布时间】:2016-07-23 13:01:00 【问题描述】:

我正在使用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")
            
        

【问题讨论】:

您是否将CheapjackManager.sharedManager 的代理设置为DownloadsViewController @user3480295 是的。 【参考方案1】:

DownloadsViewController 如果你关闭它,它将是 deinit 。

请注意,CheapjackManager 中的 delegateweak。关闭 DownloadsViewController 后,delegate 将设置为 nil,任何对 delegate 的调用都将被忽略,包括 cheapjackManager:didiFinishDownload:

与此同时,CheapjackManager 仍在为您下载资源。只是在DownloadsViewController观察不到。

【讨论】:

我可以避免 deinit 调用吗? 尝试将委托设置为其他实例,例如AppDelegate

以上是关于关闭 ViewController 时下载停止的主要内容,如果未能解决你的问题,请参考以下文章

GADInterstitial presentFromRootViewController导致当前的View Controller关闭

iOS Swift 在视图关闭时停止 MoviePlayer

离开 ViewController 时停止 AVCaptureSession

浏览 ViewController 时声音停止

如何在其他视图中恢复数据下载?

在智能手机上停止下载图像