Загрузка останавливается при выходе из ViewController

Я использую библиотеку Cheapjack (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 ответ

Решение

DownloadsViewController было бы deinit, если вы отклоните его.

Обратите внимание, что delegate из CheapjackManager является weak, После того, как вы уволите DownloadsViewController, delegate будет установлен на ноль, любой вызов delegate будут игнорироваться, в том числе cheapjackManager:didiFinishDownload:,

В то же время, CheapjackManager все еще загружает ресурс для вас. Просто не могу наблюдать это в DownloadsViewController,

Другие вопросы по тегам