【发布时间】:2015-06-24 10:11:01
【问题描述】:
我已尝试使用此link 仅下载一个 URL。也成功地为暂停和恢复工作。
现在我正在尝试多个 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
}
}
【问题讨论】:
标签: swift cocoa-touch ios8 nsoperation nsoperationqueue