gpt4 book ai didi

swift - 如何在并发模式下从多个 URL 下载数据?

转载 作者:行者123 更新时间:2023-11-28 09:05:05 25 4
gpt4 key购买 nike

我试过这个link只下载一个网址。也成功地为暂停和恢复工作。

现在我正在尝试多个 URL(即 5 个 URL)。如果第二个 URL 正在运行,那时候如果我启动第三个 URL 意味着,第二个将停止。

我不知道并发运行所有 url。我试过 NSOperationQueue。但我不知道确切的语法,也不知道如何在队列中添加任务。

我的 URL 链接之间不应有任何中断。如何做到这一点?

我的代码:

var dict = [NSURLSessionTask:Int]()

lazy var session : NSURLSession = {
let config = NSURLSessionConfiguration.ephemeralSessionConfiguration()

config.allowsCellularAccess = false
let session = NSURLSession(configuration: config, delegate: self, delegateQueue: NSOperationQueue.mainQueue())

println(session)
return session

}()

func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten writ: Int64, totalBytesExpectedToWrite exp: Int64) {
if let numberOfTask = dict[downloadTask]
{
println("which task is this\(dict[downloadTask])")

println("downloaded \(100*writ/exp)")
taskTotalBytesWritten = Int(writ)
taskTotalBytesExpectedToWrite = Int(exp)
percentageWritten = Float(taskTotalBytesWritten) / Float(taskTotalBytesExpectedToWrite)

downLoadTblVw.delegate = self
downLoadTblVw.reloadData()
}
}

func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didResumeAtOffset fileOffset: Int64, expectedTotalBytes: Int64) {


// unused in this example
}

func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {
println("completed: error: \(error)")
}

// this is the only required NSURLSessionDownloadDelegate method

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

let documentsDirectoryURL = NSFileManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first as NSURL
println("Finished downloading!")
println(documentsDirectoryURL)
var err:NSError?

// Here you can move your downloaded file
if NSFileManager().moveItemAtURL(location, toURL: documentsDirectoryURL.URLByAppendingPathComponent(downloadTask.response!.suggestedFilename!), error: &err) {
println("File saved")
} else {
if let err = err {
println("File not saved.\n\(err.description)")

}
}

}



@IBAction func startDownload(sender: UIButton) {
var btnPos: CGPoint = sender.convertPoint(CGPointZero, toView: downLoadTblVw)
var indePath: NSIndexPath = downLoadTblVw.indexPathForRowAtPoint(btnPos)!

println("INDE\(indePath.row)")

buttonTag = indePath.row

if self.task != nil {

println("PRESSED TASK NIL")
return
}

switch(buttonTag)
{
case 0:

var myQueue = NSOperationQueue()
myQueue.addOperationWithBlock({

let s = "https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/MobileHIG.pdf"
let url = NSURL(string:s)!
let req = NSMutableURLRequest(URL:url)
let task = self.session.downloadTaskWithRequest(req)
self.task = task

dict[task] = 0
println("SESSION -> task \(task)")

task.resume()
println("PRESSED SECOND TIME")
})
break

case 1:

let s = "https://developer.apple.com/library/ios/documentation/iphone/conceptual/iphoneosprogrammingguide/iphoneappprogrammingguide.pdf"
let url = NSURL(string:s)!
let req = NSMutableURLRequest(URL:url)

var myQueue = NSOperationQueue()
myQueue.addOperationWithBlock({

let task = self.session.downloadTaskWithRequest(req)
self.task_1 = task
dict[task_1] = 1
println("SESSION _1-> task \(task)")
task.resume()

})
break

case 2:

let s = "http://manuals.info.apple.com/MANUALS/1000/MA1565/en_US/iphone_user_guide.pdf"
let url = NSURL(string:s)!
let req = NSMutableURLRequest(URL:url)
let task = self.session.downloadTaskWithRequest(req)
self.task_2 = task
dict[task_2] = 2
println("SESSION _2-> task \(task)")
task.resume()
break

case 3:

let s = "https://developer.apple.com/library/ios/documentation/AudioVideo/Conceptual/AVFoundationPG/AVFoundationPG.pdf"
let url = NSURL(string:s)!
let req = NSMutableURLRequest(URL:url)
let task = self.session.downloadTaskWithRequest(req)
self.task_3 = task
dict[task_3] = 3
println("SESSION _3-> task \(task)")
task.resume()

break
default:
println("WRONG BUTTON PRESSED")
break
}
}

最佳答案

您可以使用图书馆 Alamofire来处理这种情况。其实质就是使用多线程从url中获取数据,调用一些回调函数来处理数据。您可以阅读库的文档。

关于swift - 如何在并发模式下从多个 URL 下载数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31023785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com