IOS分别利用NSURLSession和AFNetworking实现下载文件

利用NSURLSession 创建下载任务

需要注意的是更新UI必须要到主线程中调用,下载后得到的URL是临时创建,随着block销毁而删除.
利用改变NSURLSessionConfiguration 后的方法可以实现程序进入后台继续下载任务

NSURLRequest *request = [NSURLRequest requestWithURL:_imageUrl];
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
   
    NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
 
    NSURLSessionDownloadTask *task = [session downloadTaskWithRequest:request
                                                    completionHandler:
                              ^(NSURL *location, NSURLResponse *response, NSError *error) {

                                      UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:location]];
                                      dispatch_async(dispatch_get_main_queue(), ^{
                                          self.imageView.image = image;
                                      });

                                         
    }];
    [task resume];


利用AFN和NSURLSession协作创建下载任务

利用AFN框架下载文件可以指定永久存储路径——通过修改destination的block返回的url地址  。而且完成的block默认是在主线程执行。

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
   
    AFURLSessionManager *manager = [[AFURLSessionManager alloc]initWithSessionConfiguration:configuration];
   
    NSURLRequest *request = [NSURLRequest requestWithURL:_imageUrl];
   
    NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath,NSURLResponse *response) {
       
        NSURL *downloadURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
        return [downloadURL URLByAppendingPathComponent:[response suggestedFilename]];
       
    } completionHandler:^(NSURLResponse *response,NSURL *filePath, NSError *error) {
        //此处已经在主线程了
        UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:filePath]];
            self.imageView.image = image;
    }];
   
    [downloadTask resume];
        
不管用哪种方法最后一定要执行 task 的 resume方法 因为默认下载操作是挂起的,必须先手动恢复下载。

你可能感兴趣的:(IOS开发,AFN,NSURLSession,IOS,下载,多线程)