AFNetworking 3.0.4

AFNetworking是一款在OS X和iOS下都令人喜爱的网络库。为了迎合iOS新版本的升级, AFNetworking在3.0版本中删除了基于 NSURLConnection API的所有支持。如果你的项目以前使用过这些API,建议您立即升级到基于 NSURLSession 的API的AFNetworking的版本。本指南将引导您完成这个过程。

本指南是为了引导使用AFNetworking 2.x升级到最新的版本API,以达到过渡的目的,并且解释了新增和更改的设计结构。

新设备要求: iOS 7, Mac OS X 10.9, watchOS 2, tvOS 9, & Xcode 7

AFNetworking 3.0正式支持的iOS 7, Mac OS X的10.9, watchOS 2 , tvOS 9 和Xcode 7。如果你想使用AFNetworking在针对较旧版本的SDK项目,请检查README的兼容性信息。

NSURLConnection的API已废弃

AFNetworking 1.0建立在NSURLConnection的基础API之上 ,AFNetworking 2.0开始使用NSURLConnection的基础API ,以及较新基于NSURLSession的API的选项。 AFNetworking 3.0现已完全基于NSURLSession的API,这降低了维护的负担,同时支持苹果增强关于NSURLSession提供的任何额外功能。由于Xcode 7中,NSURLConnection的API已经正式被苹果弃用。虽然该API将继续运行,但将没有新功能将被添加,并且苹果已经通知所有基于网络的功能,以充分使NSURLSession向前发展。

AFNetworking 2.X将继续获得关键的隐患和安全补丁,但没有新的功能将被添加。Alamofire(Swift下的网络请求)软件基金会建议,所有的项目迁移到基于NSURLSession的API。

弃用的类

下面的类已从AFNetworking 3.0中废弃:

  • AFURLConnectionOperation

  • AFHTTPRequestOperation

  • AFHTTPRequestOperationManager

修改的类

下面的类包含基于NSURLConnection的API的内部实现。他们已经被使用NSURLSession重构:

  • UIImageView+AFNetworking

  • UIWebView+AFNetworking

  • UIButton+AFNetworking

迁移

AFHTTPRequestOperationManager 核心代码

如果你以前使用 AFHTTPRequestOperationManager , 你将需要迁移去使用 AFHTTPSessionManager。 以下的类在两者过渡间并没有变化:

  • securityPolicy

  • requestSerializer

  • responseSerializer

接下来举一个关于AFHTTPSessionManager的简单例子。注意HTTP网络请求返回的不再是AFHTTPRequestOperation, 修改成为了NSURLSessionTask,并且成功和失败的Block块中的参数也变更为了NSURLSessionTask,而不再是AFHTTPRequestOperation。

AFNetworking 2.x

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@"请求的url" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"成功");
} failure:^(AFHTTPRequestOperation *operation, NSError*error) {
        NSLog(@"失败");
}];

AFNetworking 3.0

AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
[session GET:@"请求的url" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
        NSLog(@"成功");
} failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"失败");        
}];

AFHTTPRequestOperation 核心代码

与NSURLConnection对象不同,每个共享应用范围的设置如会话管理、缓存策略、Cookie存储以及URL协议等,这些NSURLSession对象都可以单独进行配置。使用特定的配置来初始化会话,它可以发送任务来获取数据,并上传或下载文件。

在AFNetworking 2.0中,使用AFHTTPRequestOperation,有可能创建一个没有额外开销的独立的网络请求来获取数据。NSURLSession则需要更多的开销,为了获得所要请求的数据。

接下来,将要通过AFHTTPSessionManager创建一个单例,并创建一个任务和启动它。

AFNetworking 2.x

NSURL *URL = [NSURL URLWithString:@""];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
op.responseSerializer = [AFJSONResponseSerializer serializer];
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
}];
[[NSOperationQueue mainQueue] addOperation:op];

AFNetworking 3.0

NSURL *URL = [NSURL URLWithString:@""];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager GET:URL.absoluteString parameters:nil success:^(NSURLSessionTask *task, id responseObject) {
        NSLog(@"JSON: %@", responseObject);
} failure:^(NSURLSessionTask *operation, NSError *error) {
        NSLog(@"Error: %@", error);
}];

UIKit的迁移

图片下载已经被重构,以遵循AlamofireImage架构与新的AFImageDownloader类。这个类的图片下载职责的代理人是UIButton与UIImageView的类目,并且提供了一些方法,在必要时可以自定义。类别中,下载远程图片的实际方法没有改变。

UIWebView的类目被重构为使用AFHTTPSessionManager作为其网络请求。

UIAlertView的类目被废弃

从AFNetworking 3.0后UIAlertView的类目因过时而被废弃。并没有提供UIAlertController类目的计划,因为这是应用程序应处理的逻辑,而不是这个库。

AFNetworing 3.0.4

在iOS9、xcode7之后NSURLConnection的API被弃用了,取而代之的是NSURLSession,AFNetworking已经更新到3.0.4版本了,下边是最新的AFNetworking GET请求的写法:

AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];  
sessionManager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];  
[sessionManager GET:kFirstPageList parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {  
    NSLog(@"%lld", downloadProgress.totalUnitCount);  
} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {  
    NSLog(@"%@", responseObject);  
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {  
    NSLog(@"%@",error);  
}];  

AFNetworking 3.1.0 

基本使用

#import "HttpsManager.h"  
  
@implementation HttpsManager  
#pragma mark - 创建请求者  
+(AFHTTPSessionManager *)manager{  
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];  
    // 超时时间  
    manager.requestSerializer.timeoutInterval = kTimeOutInterval;  
    // 声明上传的是json格式的参数,需要你和后台约定好,不然会出现后台无法获取到你上传的参数问题  
    manager.requestSerializer = [AFHTTPRequestSerializer serializer]; // 上传普通格式  
    //manager.requestSerializer = [AFJSONRequestSerializer serializer]; // 上传JSON格式    
    // 声明获取到的数据格式  
    manager.responseSerializer = [AFHTTPResponseSerializer serializer]; // AFN不会解析,数据是data,需要自己解析  
   //manager.responseSerializer = [AFJSONResponseSerializer serializer]; // AFN会JSON解析返回的数据  
   // 个人建议还是自己解析的比较好,有时接口返回的数据不合格会报3840错误,大致是AFN无法解析返回来的数据  
    return manager;  
}  
  
+ (void)getUserCarShopAndSalesDataForSalesWithUserId:(NSString *)userId date:(NSString *)date selectAreaType:(NSString *)areaType Success:(SuccessBlock)success fail:(AFNErrorBlock)fail  {  
    // get请求也可以直接将参数放在字典里,AFN会自己讲参数拼接在url的后面,不需要自己凭借  
    NSDictionary *param = @{@"user_id":userId, @"sale_date":date, @"accessToken":@"e9c0e60318ebd07ec2fe", @"area_type":areaType}; 
    // 创建请求类  
    AFHTTPSessionManager *manager = [self manager];  
    [manager GET:@"http://pm.yunhan-china.com/index.php/Api_sale/sales_get" parameters:param progress:^(NSProgress * _Nonnull downloadProgress) {  
    // 这里可以获取到目前数据请求的进度  
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {  
    // 请求成功  
     if(responseObject){  
      NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];  
      success(dict,YES);  
    }else{  
      success(@{@"msg":@"暂无数据"}, NO);  
    }  
  } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {  
        // 请求失败  
        fail(error);  
  }];  
}  
  
+ (void)loginWithUserAccount:(NSString *)account password:(NSString *)password success:(SuccessBlock)success fail:(AFNErrorBlock)fail  {  
    // 将请求参数放在请求的字典里  
    NSDictionary *param = @{@"phoneNumber":account, @"password":@"f379eaf3c831b04de153469d1bec345e"};  
    // 创建请求类  
    AFHTTPSessionManager *manager = [self manager];  
    [manager POST:@"http://pm.yunhan-china.com/index.php/api_common/login"  
       parameters:param  
         progress:^(NSProgress * _Nonnull uploadProgress) {  
        // 这里可以获取到目前数据请求的进度  
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {  
        // 请求成功  
        if(responseObject){  
            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];  
            success(dict,YES);  
        } else {  
            success(@{@"msg":@"暂无数据"}, NO);  
        }  
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {  
        // 请求失败  
        fail(error);  
    }];  
      
}  
  
- (void)downLoadWithUrlString:(NSString *)urlString  {  
    // 1.创建管理者对象  
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];  
    // 2.设置请求的URL地址  
    NSURL *url = [NSURL URLWithString:urlString];  
    // 3.创建请求对象  
    NSURLRequest *request = [NSURLRequest requestWithURL:url];  
    // 4.下载任务  
    NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
        // 下载进度  
        NSLog(@"当前下载进度为:%lf", 1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);  
    } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {  
        // 下载地址  
        NSLog(@"默认下载地址%@",targetPath);  
        // 设置下载路径,通过沙盒获取缓存地址,最后返回NSURL对象  
        NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];  
        return [NSURL fileURLWithPath:filePath]; // 返回的是文件存放在本地沙盒的地址  
    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {  
        // 下载完成调用的方法  
        NSLog(@"%@---%@", response, filePath);  
    }];  
    // 5.启动下载任务  
    [task resume];  
}  
  
- (void)uploadWithUser:(NSString *)userId UrlString:(NSString *)urlString upImg:(UIImage *)upImg  {  
    // 创建管理者对象  
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];  
    // 参数  
    NSDictionary *param = @{@"user_id":userId};  
    [manager POST:urlString parameters:param constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {  
        /******** 1.上传已经获取到的img *******/  
        // 把图片转换成data  
        NSData *data = UIImagePNGRepresentation(upImg);  
        // 拼接数据到请求题中  
        [formData appendPartWithFileData:data name:@"file" fileName:@"123.png" mimeType:@"image/png"];  
        /******** 2.通过路径上传沙盒或系统相册里的图片 *****/  
      //[formData appendPartWithFileURL:[NSURL fileURLWithPath:@"文件地址"] name:@"file" fileName:@"1234.png" mimeType:@"application/octet-stream" error:nil];  
    } progress:^(NSProgress * _Nonnull uploadProgress) {  
        // 打印上传进度  
        NSLog(@"%lf",1.0 *uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);  
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {  
        //请求成功  
        NSLog(@"请求成功:%@",responseObject);    
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {  
        //请求失败  
        NSLog(@"请求失败:%@",error);  
    }];  
}  
  
- (void)AFNetworkStatus{    
    //1.创建网络监测者  
    AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];  
    /*枚举里面四个状态  分别对应 未知 无网络 数据 WiFi 
     typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) { 
     AFNetworkReachabilityStatusUnknown          = -1,      未知 
     AFNetworkReachabilityStatusNotReachable     = 0,       无网络 
     AFNetworkReachabilityStatusReachableViaWWAN = 1,       蜂窝数据网络 
     AFNetworkReachabilityStatusReachableViaWiFi = 2,       WiFi 
     }; 
     */  
    [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {  
        //这里是监测到网络改变的block  可以写成switch方便  
        //在里面可以随便写事件  
        switch (status) {  
            case AFNetworkReachabilityStatusUnknown:  
                NSLog(@"未知网络状态");  
                break;  
            case AFNetworkReachabilityStatusNotReachable:  
                NSLog(@"无网络");  
                break;    
            case AFNetworkReachabilityStatusReachableViaWWAN:  
                NSLog(@"蜂窝数据网");  
                break;  
            case AFNetworkReachabilityStatusReachableViaWiFi:  
                NSLog(@"WiFi网络");  
                break;  
            default:  
                break;  
        }     
    }] ;  
}  
@end  
注意:AFNetworking可以进行JSON数据解析/Plist数据解析.(不支持XML数据解析)
URL字符串中如果有特殊字符或者中文字符,AFNETWorking并没有做UTF8的转码,需要:url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

在使用Python来安装geopandas包时,由于geopandas依赖于几个其他的Python库(如GDAL, Fiona, Pyproj, Shapely等),因此安装过程可能需要一些额外的步骤。以下是一个基本的安装指南,适用于大多数用户: 使用pip安装 确保Python和pip已安装: 首先,确保你的计算机上已安装了Python和pip。pip是Python的包管理工具,用于安装和管理Python包。 安装依赖库: 由于geopandas依赖于GDAL, Fiona, Pyproj, Shapely等库,你可能需要先安装这些库。通常,你可以通过pip直接安装这些库,但有时候可能需要从其他源下载预编译的二进制包(wheel文件),特别是GDAL和Fiona,因为它们可能包含一些系统级的依赖。 bash pip install GDAL Fiona Pyproj Shapely 注意:在某些系统上,直接使用pip安装GDAL和Fiona可能会遇到问题,因为它们需要编译一些C/C++代码。如果遇到问题,你可以考虑使用conda(一个Python包、依赖和环境管理器)来安装这些库,或者从Unofficial Windows Binaries for Python Extension Packages这样的网站下载预编译的wheel文件。 安装geopandas: 在安装了所有依赖库之后,你可以使用pip来安装geopandas。 bash pip install geopandas 使用conda安装 如果你正在使用conda作为你的Python包管理器,那么安装geopandas和它的依赖可能会更简单一些。 创建一个新的conda环境(可选,但推荐): bash conda create -n geoenv python=3.x anaconda conda activate geoenv 其中3.x是你希望使用的Python版本。 安装geopandas: 使用conda-forge频道来安装geopandas,因为它提供了许多地理空间相关的包。 bash conda install -c conda-forge geopandas 这条命令会自动安装geopandas及其所有依赖。 注意事项 如果你在安装过程中遇到任何问题,比如编译错误或依赖问题,请检查你的Python版本和pip/conda的版本是否是最新的,或者尝试在不同的环境中安装。 某些库(如GDAL)可能需要额外的系统级依赖,如地理空间库(如PROJ和GEOS)。这些依赖可能需要单独安装,具体取决于你的操作系统。 如果你在Windows上遇到问题,并且pip安装失败,尝试从Unofficial Windows Binaries for Python Extension Packages网站下载相应的wheel文件,并使用pip进行安装。 脚本示例 虽然你的问题主要是关于如何安装geopandas,但如果你想要一个Python脚本来重命名文件夹下的文件,在原始名字前面加上字符串"geopandas",以下是一个简单的示例: python import os # 指定文件夹路径 folder_path = 'path/to/your/folder' # 遍历文件夹中的文件 for filename in os.listdir(folder_path): # 构造原始文件路径 old_file_path = os.path.join(folder_path, filename) # 构造新文件名 new_filename = 'geopandas_' + filename # 构造新文件路径 new_file_path = os.path.join(folder_path, new_filename) # 重命名文件 os.rename(old_file_path, new_file_path) print(f'Renamed "{filename}" to "{new_filename}"') 请确保将'path/to/your/folder'替换为你想要重命名文件的实际文件夹路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值