关闭 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
中的 delegate
是 weak
。关闭 DownloadsViewController
后,delegate
将设置为 nil,任何对 delegate
的调用都将被忽略,包括 cheapjackManager:didiFinishDownload:
。
与此同时,CheapjackManager
仍在为您下载资源。只是在DownloadsViewController
观察不到。
【讨论】:
我可以避免 deinit 调用吗? 尝试将委托设置为其他实例,例如AppDelegate
。以上是关于关闭 ViewController 时下载停止的主要内容,如果未能解决你的问题,请参考以下文章
GADInterstitial presentFromRootViewController导致当前的View Controller关闭
iOS Swift 在视图关闭时停止 MoviePlayer