Showing the file download progress with NSURLSessionDataTask
You need to implement following delegates:
<NSURLSessionDataDelegate, NSURLSessionDelegate, NSURLSessionTaskDelegate>
Also need to create two properties:
@property (nonatomic, retain) NSMutableData *dataToDownload;
@property (nonatomic) float downloadSize;
- (void)viewDidLoad {
[super viewDidLoad];
NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];
NSURL *url = [NSURL URLWithString: @"your url"];
NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithURL: url];
[dataTask resume];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler {
completionHandler(NSURLSessionResponseAllow);
progressBar.progress=0.0f;
_downloadSize=[response expectedContentLength];
_dataToDownload=[[NSMutableData alloc]init];
}
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
[_dataToDownload appendData:data];
progressBar.progress=[ _dataToDownload length ]/_downloadSize;
}
NSURLSession Download Task- Progress Bar Issue
You said:
When i am trying to download and delete it and again download Attempted to create a task in a session that has been invalidated *** Terminating app due to uncaught exception 'NSGenericException', reason: 'Task created in a session that has been invalidated'
This is because you're calling finishTasksAndInvalidate
, which tells NSURLSession
that it should not only finish all queues tasks, but invalidate the session and not permit any more tasks. But there's another task to run, but you invalidated the session.
Bottom line, feel free to cancel a task, but don't invalidate the session object if you're going to start more tasks for the same session object.
Send Progress from NSURLSession to ViewController [swift - iOS]
I 'd like to tell you a good tutorial about this question. NSURLSession Tutorial
Find the Download Progress of a file in swift
The progress status can be calculated in
URLSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)
This is a one of three required methods of protocol NSURLSessionDownloadDelegate. In my case the code of the method looks like this:
func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
// println("download task did write data")
let progress = Float(totalBytesWritten) / Float(totalBytesExpectedToWrite)
dispatch_async(dispatch_get_main_queue()) {
self.progressDownloadIndicator.progress = progress
}
}
I've created a small project, which implements three different approaches:
- download synchronously
- download asynchronously
- download with progress
Check it out: http://goo.gl/veRkA7
get progress from dataTaskWithURL in swift
you can use this code for showing download process with progress bar with its delegate functions.
import UIKit
class ViewController: UIViewController,NSURLSessionDelegate,NSURLSessionDataDelegate{
@IBOutlet weak var progress: UIProgressView!
var buffer:NSMutableData = NSMutableData()
var session:NSURLSession?
var dataTask:NSURLSessionDataTask?
let url = NSURL(string:"http://i.stack.imgur.com/b8zkg.png" )!
var expectedContentLength = 0
override func viewDidLoad() {
super.viewDidLoad()
progress.progress = 0.0
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
let manqueue = NSOperationQueue.mainQueue()
session = NSURLSession(configuration: configuration, delegate:self, delegateQueue: manqueue)
dataTask = session?.dataTaskWithRequest(NSURLRequest(URL: url))
dataTask?.resume()
// Do any additional setup after loading the view, typically from a nib.
}
func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -> Void) {
//here you can get full lenth of your content
expectedContentLength = Int(response.expectedContentLength)
println(expectedContentLength)
completionHandler(NSURLSessionResponseDisposition.Allow)
}
func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {
buffer.appendData(data)
let percentageDownloaded = Float(buffer.length) / Float(expectedContentLength)
progress.progress = percentageDownloaded
}
func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {
//use buffer here.Download is done
progress.progress = 1.0 // download 100% complete
}
}
Related Topics
Phonegap 3.0 iOS Plugins Not Found
How to Call JavaScript Function in Objective C
How to Use Autolayout to Provide Different Constraints for Landscape and Portrait Orientations
Autolayout Problems with iOS8 with Code That Works Fine on iOS7
Uivisualeffectview with Mask Layer
How to Show a View on the First Launch Only
How to Delete All Objects from My Persistent Store in Core Data
Xmppframework - Retrieve Archived Messages from Openfire Server
Play Video in Background Using Avplayer
How to Detect If iOS App Is Running in UI Testing Mode
How to Verify That I am Running on a Given Gcd Queue Without Using Dispatch_Get_Current_Queue()
Proper Use of Loadview and Viewdidload with Uiviewcontroller Without Nibs/Xibs
Scroll to Bottom of Uitextview Erratic in iOS 7
Programmatically Get a Storyboard Id
Getter VS Computed Property. What Would Warrant Using One of These Approaches Over the Other