AFN

1.AFN框架基本使用

  • 1 AFN內(nèi)部結(jié)構(gòu)
AFN結(jié)構(gòu)體
    - NSURLConnection(iOS9.0廢棄了)
        + AFURLConnectionOperation
        + AFHTTPRequestOperation
        + AFHTTPRequestOperationManager(封裝了常用的 HTTP 方法)
            * 屬性
                * baseURL :AFN建議開發(fā)者針對 AFHTTPRequestOperationManager 自定義個一個單例子類蹬竖,設(shè)置 baseURL, 所有的網(wǎng)絡(luò)訪問,都只使用相對路徑即可
                * requestSerializer :請求數(shù)據(jù)格式/默認(rèn)是二進(jìn)制的 HTTP
                * responseSerializer :響應(yīng)的數(shù)據(jù)格式/默認(rèn)是 JSON 格式
                * operationQueue
                * reachabilityManager :網(wǎng)絡(luò)連接管理器
            * 方法
                * manager :方便創(chuàng)建管理器的類方法
                * HTTPRequestOperationWithRequest :在訪問服務(wù)器時,如果要告訴服務(wù)器一些附加信息匈棘,都需要在 Request 中設(shè)置
                * GET
                * POST

    - NSURLSession
        + AFURLSessionManager
        + AFHTTPSessionManager(封裝了常用的 HTTP 方法)
            * GET
            * POST
            * UIKit + AFNetworking 分類
            * NSProgress :利用KVO

    - 半自動的序列化&反序列化的功能
        + AFURLRequestSerialization :請求的數(shù)據(jù)格式/默認(rèn)是二進(jìn)制的
        + AFURLResponseSerialization :響應(yīng)的數(shù)據(jù)格式/默認(rèn)是JSON格式
    - 附加功能
        + 安全策略
            * HTTPS
            * AFSecurityPolicy
        + 網(wǎng)絡(luò)檢測
            * 對蘋果的網(wǎng)絡(luò)連接檢測做了一個封裝
            * AFNetworkReachabilityManager

建議:
可以學(xué)習(xí)下AFN對 UIKit 做了一些分類, 對自己能力提升是非常有幫助的
  • 2 AFN的基本使用

(1)發(fā)送GET請求的兩種方式(POST同)

-(void)get1
{
    //1.創(chuàng)建AFHTTPRequestOperationManager管理者
    //AFHTTPRequestOperationManager內(nèi)部是基于NSURLConnection實(shí)現(xiàn)的
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

    //2.發(fā)送請求
    /*
     http://120.25.226.186:32812/login?username=ee&pwd=ee&type=JSON
     第一個參數(shù):NSString類型的請求路徑,AFN內(nèi)部會自動將該路徑包裝為一個url并創(chuàng)建請求對象
     第二個參數(shù):請求參數(shù)蒸绩,以字典的方式傳遞车柠,AFN內(nèi)部會判斷當(dāng)前是POST請求還是GET請求,以選擇直接拼接還是轉(zhuǎn)換為NSData放到請求體中傳遞
     第三個參數(shù):請求成功之后回調(diào)Block
     第四個參數(shù):請求失敗回調(diào)Block
     */

    NSDictionary *param = @{
                            @"username":@"",
                            @"pwd":@""
                            };

    //注意:字符串中不能包含空格
    [manager GET:@"http://120.25.226.186:32812/login" parameters:param success:^(AFHTTPRequestOperation * _Nonnull operation, id  _Nonnull responseObject) {

        NSLog(@"請求成功---%@",responseObject);

    } failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) {
            NSLog(@"失敗---%@",error);
    }];
}

-(void)get2
{
    //1.創(chuàng)建AFHTTPSessionManager管理者
    //AFHTTPSessionManager內(nèi)部是基于NSURLSession實(shí)現(xiàn)的
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    //2.發(fā)送請求
    NSDictionary *param = @{
                            @"username":@"",
                            @"pwd":@""
                            };

    //注意:responseObject:請求成功返回的響應(yīng)結(jié)果(AFN內(nèi)部已經(jīng)把響應(yīng)體轉(zhuǎn)換為OC對象酗宋,通常是字典或數(shù)組)
    [manager GET:@"http://120.25.226.186:32812/login" parameters:param success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
            NSLog(@"請求成功---%@",[responseObject class]);

    } failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
        NSLog(@"失敗---%@",error);
    }];
}

(2)使用AFN下載文件

-(void)download
{
    //1.創(chuàng)建一個管理者
    AFHTTPSessionManager *manage  = [AFHTTPSessionManager manager];

    //2.下載文件
    /*
     第一個參數(shù):請求對象
     第二個參數(shù):下載進(jìn)度
     第三個參數(shù):block回調(diào),需要返回一個url地址疆拘,用來告訴AFN下載文件的目標(biāo)地址
         targetPath:AFN內(nèi)部下載文件存儲的地址蜕猫,tmp文件夾下
         response:請求的響應(yīng)頭
         返回值:文件應(yīng)該剪切到什么地方
     第四個參數(shù):block回調(diào),當(dāng)文件下載完成之后調(diào)用
        response:響應(yīng)頭
        filePath:文件存儲在沙盒的地址 == 第三個參數(shù)中block的返回值
        error:錯誤信息
     */

    //2.1 創(chuàng)建請求對象
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion_02.png"]];

    //2.2 創(chuàng)建下載進(jìn)度哎迄,并監(jiān)聽
    NSProgress *progress = nil;

    NSURLSessionDownloadTask *downloadTask = [manage downloadTaskWithRequest:request progress:&progress destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {

        NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];

        //拼接文件全路徑
        NSString *fullpath = [caches stringByAppendingPathComponent:response.suggestedFilename];
        NSURL *filePathUrl = [NSURL fileURLWithPath:fullpath];
        return filePathUrl;

    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nonnull filePath, NSError * _Nonnull error) {

        NSLog(@"文件下載完畢---%@",filePath);
    }];

    //2.3 使用KVO監(jiān)聽下載進(jìn)度
    [progress addObserver:self forKeyPath:@"completedUnitCount" options:NSKeyValueObservingOptionNew context:nil];

    //3.啟動任務(wù)
    [downloadTask resume];
}

//獲取并計(jì)算當(dāng)前文件的下載進(jìn)度
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(NSProgress *)progress change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
    NSLog(@"%zd--%zd--%f",progress.completedUnitCount,progress.totalUnitCount,1.0 * progress.completedUnitCount/progress.totalUnitCount);
}

2.AFN文件上傳

1.文件上傳拼接數(shù)據(jù)的第一種方式
[formData appendPartWithFileData:data name:@"file" fileName:@"xxoo.png" mimeType:@"application/octet-stream"];
2.文件上傳拼接數(shù)據(jù)的第二種方式
 [formData appendPartWithFileURL:fileUrl name:@"file" fileName:@"xx.png" mimeType:@"application/octet-stream" error:nil];
3.文件上傳拼接數(shù)據(jù)的第三種方式
 [formData appendPartWithFileURL:fileUrl name:@"file" error:nil];
4.【注】在資料中已經(jīng)提供了一個用于文件上傳的分類回右。

/*文件上傳相關(guān)的代碼如下*/
-(void)upload
{
    //1.創(chuàng)建一個請求管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    //2.發(fā)送POST請求上傳數(shù)據(jù)
    /*
     第一個參數(shù):請求路徑:NSString類型
     第二個參數(shù):要上傳的非文件參數(shù)
     第三個參數(shù):block回調(diào)
        在該回調(diào)中,需要利用formData拼接即將上傳的二進(jìn)制數(shù)據(jù)
     第三個參數(shù):上傳成功的block回調(diào)
        task:dataTask(任務(wù))
        responseObject:服務(wù)器返回的數(shù)據(jù)
     第四個參數(shù):上傳失敗的block回調(diào)
        error:錯誤信息漱挚,如果上傳文件失敗翔烁,那么error里面包含了錯誤的描述信息
     */

    NSDictionary *dict = @{
                           @"username":@""
                           };

    [manager POST:@"http://120.25.226.186:32812/upload" parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {

        //把本地的圖片轉(zhuǎn)換為NSData類型的數(shù)據(jù)
        UIImage *image = [UIImage imageNamed:@"123"];
        NSData *data = UIImagePNGRepresentation(image);

        /*
         //拼接二進(jìn)制文件數(shù)據(jù)
         第一個參數(shù):要上傳的文件的二進(jìn)制數(shù)據(jù)
         第二個參數(shù):服務(wù)器接口規(guī)定的名稱
         第三個參數(shù):這個參數(shù)上傳到服務(wù)器之后用什么名字來進(jìn)行保存
         第四個參數(shù):上傳文件的MIMEType類型
         */
        [formData appendPartWithFileData:data name:@"file" fileName:@"xxoo.png" mimeType:@"application/octet-stream"];

    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
        NSLog(@"請求成功---%@",responseObject);

    } failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
        NSLog(@"請求失敗--%@",error);
    }];
}

-(void)upload2
{
    NSLog(@"%s",__func__);

    //1.創(chuàng)建一個請求管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    //2.發(fā)送POST請求上傳數(shù)據(jù)
    /*
     第一個參數(shù):請求路徑:NSString類型
     第二個參數(shù):要上傳的非文件參數(shù)
     第三個參數(shù):block回調(diào)
     在該回調(diào)中,需要利用formData拼接即將上傳的二進(jìn)制數(shù)據(jù)
     第三個參數(shù):上傳成功的block回調(diào)
     task:dataTask(任務(wù))
     responseObject:服務(wù)器返回的數(shù)據(jù)
     第四個參數(shù):上傳失敗的block回調(diào)
     error:錯誤信息旨涝,如果上傳文件失敗蹬屹,那么error里面包含了錯誤的描述信息
     */

    NSDictionary *dict = @{
                           @"username":@""
                           };

    [manager POST:@"http://120.25.226.186:32812/upload" parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {

        //本地文件的url
        NSURL *fileUrl = [NSURL fileURLWithPath:@"/Users/username/Desktop/KF[WTI`AQ3T`A@3R(B96D89.gif"];
        /*
         //拼接二進(jìn)制文件數(shù)據(jù)
         第一個參數(shù):要上傳文件的url路徑
         第二個參數(shù):服務(wù)器要求的參數(shù)名稱
         第三個參數(shù):這個文件上傳到服務(wù)器之后叫什么名稱
         第四個參數(shù):文件的mimetype類型
         第五個參數(shù):錯誤信息
         */
//        [formData appendPartWithFileURL:fileUrl name:@"file" fileName:@"xx.png" mimeType:@"application/octet-stream" error:nil];

        //另外一種上傳文件的方式
        /*
         說明:該方法和上面的方法等價,不過該方法更加簡單其內(nèi)部會自動的的根據(jù)url路徑確定文件保存名稱白华,并通過內(nèi)部方法獲取上傳文件的mimetype類型
         */
        [formData appendPartWithFileURL:fileUrl name:@"file" error:nil];


    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
        NSLog(@"請求成功---%@",responseObject);

    } failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
        NSLog(@"請求失敗--%@",error);
    }];
}

3.使用AFN進(jìn)行序列化處理

/*
1.AFN它內(nèi)部默認(rèn)把服務(wù)器響應(yīng)的數(shù)據(jù)當(dāng)做json來進(jìn)行解析慨默,所以如果服務(wù)器返回給我的不是JSON數(shù)據(jù)那么請求報錯,這個時候需要設(shè)置AFN對響應(yīng)信息的解析方式弧腥。AFN提供了三種解析響應(yīng)信息的方式业筏,分別是:
1)AFXMLParserResponseSerializer----XML
2) AFHTTPResponseSerializer---------默認(rèn)二進(jìn)制響應(yīng)數(shù)據(jù)
3)AFJSONResponseSerializer---------JSON

2.還有一種情況就是服務(wù)器返回給我們的數(shù)據(jù)格式不太一致(開發(fā)者工具Content-Type:text/xml),那么這種情況也有可能請求不成功。解決方法:
1) 直接在源代碼中修改鸟赫,添加相應(yīng)的Content-Type
2) 拿到這個屬性蒜胖,添加到它的集合中

3.相關(guān)代碼
-(void)srializer
{
    //1.創(chuàng)建請求管理者,內(nèi)部基于NSURLSession
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    /* 知識點(diǎn)1:設(shè)置AFN采用什么樣的方式來解析服務(wù)器返回的數(shù)據(jù)*/

    //如果返回的是XML抛蚤,那么告訴AFN台谢,響應(yīng)的時候使用XML的方式解析
    manager.responseSerializer = [AFXMLParserResponseSerializer serializer];

    //如果返回的就是二進(jìn)制數(shù)據(jù),那么采用默認(rèn)二進(jìn)制的方式來解析數(shù)據(jù)
    //manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    //采用JSON的方式來解析數(shù)據(jù)
    //manager.responseSerializer = [AFJSONResponseSerializer serializer];


    /*知識點(diǎn)2 告訴AFN岁经,再序列化服務(wù)器返回的數(shù)據(jù)的時候朋沮,支持此種類型
    [AFJSONResponseSerializer serializer].acceptableContentTypes = [NSSet setWithObject:@"text/xml"];

    //2.把所有的請求參數(shù)通過字典的方式來裝載,GET方法內(nèi)部會自動把所有的鍵值對取出以&符號拼接并最后用?符號連接在請求路徑后面
    NSDictionary *dict = @{
                           @"username":@"223",
                           @"pwd":@"ewr",
                           @"type":@"XML"
                           };

    //3.發(fā)送GET請求
    [manager GET:@"http://120.25.226.186:32812/login" parameters:dict success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {

        //4.請求成功的回調(diào)block
        NSLog(@"%@",[responseObject class]);
    } failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {

        //5.請求失敗的回調(diào)樊拓,可以打印error的值查看錯誤信息
        NSLog(@"%@",error);
    }];
}

4.使用AFN來檢測網(wǎng)絡(luò)狀態(tài)

/*
說明:可以使用AFN框架中的AFNetworkReachabilityManager來監(jiān)聽網(wǎng)絡(luò)狀態(tài)的改變纠亚,也可以利用蘋果提供的Reachability來監(jiān)聽。建議在開發(fā)中直接使用AFN框架處理筋夏。
 */
//使用AFN框架來檢測網(wǎng)絡(luò)狀態(tài)的改變
-(void)AFNReachability
{
    //1.創(chuàng)建網(wǎng)絡(luò)監(jiān)聽管理者
    AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];

    //2.監(jiān)聽網(wǎng)絡(luò)狀態(tài)的改變
    /*
     AFNetworkReachabilityStatusUnknown          = 未知
     AFNetworkReachabilityStatusNotReachable     = 沒有網(wǎng)絡(luò)
     AFNetworkReachabilityStatusReachableViaWWAN = 3G
     AFNetworkReachabilityStatusReachableViaWiFi = WIFI
     */
    [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
            case AFNetworkReachabilityStatusUnknown:
                NSLog(@"未知");
                break;
            case AFNetworkReachabilityStatusNotReachable:
                NSLog(@"沒有網(wǎng)絡(luò)");
                break;
            case AFNetworkReachabilityStatusReachableViaWWAN:
                NSLog(@"3G");
                break;
            case AFNetworkReachabilityStatusReachableViaWiFi:
                NSLog(@"WIFI");
                break;

            default:
                break;
        }
    }];

    //3.開始監(jiān)聽
    [manager startMonitoring];
}

------------------------------------------------------------
//使用蘋果提供的Reachability來檢測網(wǎng)絡(luò)狀態(tài)蒂胞,如果要持續(xù)監(jiān)聽網(wǎng)絡(luò)狀態(tài)的概念,需要結(jié)合通知一起使用条篷。
//提供下載地址:https://developer.apple.com/library/ios/samplecode/Reachability/Reachability.zip

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //1.注冊一個通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkChange) name:kReachabilityChangedNotification object:nil];

    //2.拿到一個對象骗随,然后調(diào)用開始監(jiān)聽方法
    Reachability *r = [Reachability reachabilityForInternetConnection];
    [r startNotifier];

    //持有該對象,不要讓該對象釋放掉
    self.r = r;
}

//當(dāng)控制器釋放的時候赴叹,移除通知的監(jiān)聽
-(void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

-(void)networkChange
{
    //獲取當(dāng)前網(wǎng)絡(luò)的狀態(tài)
   if ([Reachability reachabilityForInternetConnection].currentReachabilityStatus == ReachableViaWWAN)
    {
        NSLog(@"當(dāng)前網(wǎng)絡(luò)狀態(tài)為3G");
        return;
    }

    if ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == ReachableViaWiFi)
    {
        NSLog(@"當(dāng)前網(wǎng)絡(luò)狀態(tài)為wifi");
        return;
    }

    NSLog(@"當(dāng)前沒有網(wǎng)絡(luò)");
}

5.AFN使用技巧

1.在開發(fā)的時候可以創(chuàng)建一個工具類鸿染,繼承自我們的AFN中的請求管理者,再控制器中真正發(fā)請求的代碼使用自己封裝的工具類乞巧。
2.這樣做的優(yōu)點(diǎn)是以后如果修改了底層依賴的框架涨椒,那么我們修改這個工具類就可以了,而不用再一個一個的去修改绽媒。
3.該工具類一般提供一個單例方法蚕冬,在該方法中會設(shè)置一個基本的請求路徑。
4.該方法通常還會提供對GET或POST請求的封裝些椒。
5.在外面的時候通過該工具類來發(fā)送請求
6.單例方法:
+ (instancetype)shareNetworkTools
{
    static XMGNetworkTools *instance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        // 注意: BaseURL中一定要以/結(jié)尾
        instance = [[self alloc] initWithBaseURL:[NSURL URLWithString:@"http://120.25.226.186:32812/"]];
    });
    return instance;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市掸刊,隨后出現(xiàn)的幾起案子免糕,更是在濱河造成了極大的恐慌,老刑警劉巖忧侧,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件石窑,死亡現(xiàn)場離奇詭異,居然都是意外死亡蚓炬,警方通過查閱死者的電腦和手機(jī)松逊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肯夏,“玉大人经宏,你說我怎么就攤上這事⊙被鳎” “怎么了烁兰?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長徊都。 經(jīng)常有香客問我沪斟,道長,這世上最難降的妖魔是什么暇矫? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任主之,我火速辦了婚禮择吊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘槽奕。我一直安慰自己几睛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布史翘。 她就那樣靜靜地躺著枉长,像睡著了一般。 火紅的嫁衣襯著肌膚如雪琼讽。 梳的紋絲不亂的頭發(fā)上必峰,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機(jī)與錄音钻蹬,去河邊找鬼吼蚁。 笑死,一個胖子當(dāng)著我的面吹牛问欠,可吹牛的內(nèi)容都是我干的肝匆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼顺献,長吁一口氣:“原來是場噩夢啊……” “哼旗国!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起注整,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤能曾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后肿轨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寿冕,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年椒袍,在試婚紗的時候發(fā)現(xiàn)自己被綠了驼唱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡驹暑,死狀恐怖玫恳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情优俘,我是刑警寧澤纽窟,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站兼吓,受9級特大地震影響臂港,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一审孽、第九天 我趴在偏房一處隱蔽的房頂上張望县袱。 院中可真熱鬧,春花似錦佑力、人聲如沸式散。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽暴拄。三九已至,卻和暖如春编饺,著一層夾襖步出監(jiān)牢的瞬間乖篷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工透且, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留撕蔼,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓秽誊,卻偏偏與公主長得像鲸沮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子锅论,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • AFN什么是AFN全稱是AFNetworking讼溺,是對NSURLConnection、NSURLSession的一...
    JonesCxy閱讀 1,215評論 0 5
  • 1.在開發(fā)的時候可以創(chuàng)建一個工具類最易,繼承自我們的AFN中的請求管理者怒坯,再控制器中真正發(fā)請求的代碼使用自己封裝的工具...
    紅樓那一場夢閱讀 3,487評論 2 3
  • 1.AFN框架基本使用 1 AFN內(nèi)部結(jié)構(gòu)AFN結(jié)構(gòu)體NSURLConnection(iOS9.0廢棄了)AFUR...
    smile麗語閱讀 3,475評論 4 46
  • 全稱是AFNetworking,是對NSURLSession的一層封裝 雖然運(yùn)行效率沒有ASI高耘纱,但是使用比ASI...
    翻這個墻閱讀 1,035評論 7 4
  • 1.AFN使用技巧 1.在開發(fā)的時候可以創(chuàng)建一個工具類敬肚,繼承自我們的AFN中的請求管理者毕荐,再控制器中真正發(fā)請求的代...
    YSL一路行走閱讀 1,222評論 1 3