2015-11-24 87 views
2

我想通过使用NSURLSession而不是NSURLConnection从服务器下载文件。但是当我使用它时,一些委托方法不会调用,我不知道为什么。NSURLSession方法不会调用

#import "ViewController.h" 

@interface ViewController()<NSURLSessionDelegate,NSURLSessionDataDelegate,NSURLSessionDownloadDelegate> 

@property (strong,nonatomic) NSURLSessionDownloadTask *downloadTask; 
@property (strong,nonatomic) NSURLSession *session; 


@end 

@implementation ViewController 


-(void)viewWillAppear:(BOOL)animated{ 
[super viewWillAppear:animated]; 
NSURLSessionConfiguration *backgroundConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.webcash.TestingNSURLSession"]; 
self.session = [NSURLSession sessionWithConfiguration:backgroundConfiguration delegate:self delegateQueue:nil]; 
} 

- (void)viewDidLoad { 
[super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 
} 

- (void)didReceiveMemoryWarning { 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 
- (IBAction)startDownload:(id)sender { 
NSURL *downloadRUL = [NSURL URLWithString:@"http://laguboard.com/music/down/33867378/2794942/NTU0NktpZE56eERWZGxVeC9zTS9LVUd1TEhkZTE0cFZuaW1QS1pFMHVhOUNkM2ZoZEE=/(http://mp3xload.wapka.me).mp3"]; 
self.downloadTask = [self.session downloadTaskWithURL:downloadRUL]; 
[self.downloadTask resume]; 
} 

- (IBAction)stopDownload:(id)sender { 

} 

// ====== THIS METHOD IS NOT CALLING 

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{ 

if (totalBytesExpectedToWrite == NSURLSessionTransferSizeUnknown) { 
    return; 
} else { 
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
     double progress = (double)totalBytesWritten/(double)totalBytesExpectedToWrite; 
     NSLog(@"Downloading progress : %f",progress); 
    }]; 
} 

} 

// ============== 

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { 

if (error != nil) { 
    NSLog(@"Error : %@",[error localizedDescription]); 
} else { 
    NSLog(@"Download finished"); 
} 

} 

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{ 

NSError *error; 
NSFileManager *fileManager = [NSFileManager defaultManager]; 

NSArray *urls = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]; 
NSURL *documentsDirectory = [urls objectAtIndex:0]; 
NSURL *originalURL = [[downloadTask originalRequest] URL]; 
NSURL *destinationURL = [documentsDirectory URLByAppendingPathComponent:[originalURL lastPathComponent]]; 
[fileManager removeItemAtURL:destinationURL error:NULL]; 
BOOL success = [fileManager copyItemAtURL:location toURL:destinationURL error:&error]; 

if (success) { 
    NSLog(@"Download finished"); 
} else { 
    NSLog(@"Error : %@",error.description); 
} 

} 

@end 

我跟进了很多教程,但它仍然无法正常工作。请帮我解决这个问题。谢谢。!

回答

1
#import "ViewController.h" 

@interface ViewController()<NSURLSessionDelegate, NSURLSessionTaskDelegate> 

@property (nonatomic, strong) NSMutableData *activeDownload; 
@property (nonatomic, strong) NSURLSessionTask *downloadTask; 
@property (nonatomic, assign) NSInteger downloadSize; 
@property (nonatomic, assign) NSInteger downloadedSize; 


@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 
- (IBAction)startDownload:(id)sender { 
    self.downloadedSize = 0; 
    NSURL *nsurl = [NSURL URLWithString:@"http://laguboard.com/music/down/33867378/2794942/NTU0NktpZE56eERWZGxVeC9zTS9LVUd1TEhkZTE0cFZuaW1QS1pFMHVhOUNkM2ZoZEE=/(http://mp3xload.wapka.me).mp3"]; 
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    NSURLSession *downloadSession = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil]; 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:nsurl]; 
    self.downloadTask = [downloadSession dataTaskWithRequest:request]; 
    [self.downloadTask resume]; 
    [downloadSession finishTasksAndInvalidate]; 
} 

- (IBAction)stopDownload:(id)sender { 
    [self.downloadTask cancel]; 
    self.downloadTask = nil; 
    self.activeDownload = nil; 
} 

#pragma mark - NSURLSessionDataDelegate methods 

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler 
{ 
    completionHandler(NSURLSessionResponseAllow); 
    self.activeDownload = [[NSMutableData alloc] init]; 
    NSString *contentLength = [[(NSHTTPURLResponse *)response allHeaderFields] valueForKey:@"Content-Length"]; 
    self.downloadSize = contentLength.integerValue; 
} 

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data 
{ 
    [self.activeDownload appendData:data]; 
    self.downloadedSize += [data length]; 
    float downloadProgress = ((float) self.downloadedSize/(float) self.downloadSize) * 100; 
    //percentage of downloading progress 
} 

#pragma mark - NSURLSessionTaskDelegate methods 

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error 
{ 
    if (error != nil) { 
     NSLog(@"Error : %@",[error localizedDescription]); 
    } else { 
     NSLog(@"Download finished"); 
     //the data is in self.activeDownload 
    } 
    self.activeDownload = nil; 
    self.downloadTask = nil; 
} 

@end 
+0

,我应该怎么做,如果我想知道下载进度的百分比是多少? – vichhai

+0

我编辑了响应来计算下载进度的百分比。我希望它能帮助你 –