溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

iOS網(wǎng)絡(luò)開(kāi)發(fā)(3)使用NSURLSession

發(fā)布時(shí)間:2020-08-04 20:33:22 來(lái)源:網(wǎng)絡(luò) 閱讀:797 作者:ymanmeng123 欄目:移動(dòng)開(kāi)發(fā)
  • NSURLSession介紹

NSURLSession在iOS7.0開(kāi)始引入,在框架中的地位與NSURLConnection并列

    NSURLSession能夠完成所有NSURLConnection的功能,并且進(jìn)行了非常大的功能擴(kuò)充


從iOS9.0開(kāi)始,蘋(píng)果正式棄用NSURLConnection


下圖為NSURLSession的使用過(guò)程涉及到的主要類即它們之間的關(guān)系

     iOS網(wǎng)絡(luò)開(kāi)發(fā)(3)使用NSURLSession


三種工作模式:

     默認(rèn)會(huì)話模式:類似于NSURLConnection,使用磁盤(pán)緩存

     瞬時(shí)會(huì)話模式:不使用磁盤(pán)緩存

     后臺(tái)會(huì)話模式:在程序進(jìn)入后臺(tái)時(shí)也能上傳或下載


     NSURLSessionConfigration用于生成這三種工作模式的配置,方法如下

+ (NSURLSessionConfiguration *)defaultSessionConfiguration
+ (NSURLSessionConfiguration *)ephemeralSessionConfiguration
+ (NSURLSessionConfiguration *)backgroundSessionConfigurationWithIdentifier:(NSString *)identifier


NSURLSession會(huì)話對(duì)象的創(chuàng)建:

// 使用默認(rèn)會(huì)話模式、默認(rèn)的緩存、cookie及credential
+ (NSURLSession *)sharedSession
// 使用指定的工作模式
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration*)configuration
// 使用指定的工作模式、任務(wù)運(yùn)行時(shí)的隊(duì)列、代理
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration*)configuration delegate:(id<NSURLSessionDelegate>)delegate delegateQueue:(NSOperationQueue *)queue


NSURLSession發(fā)送網(wǎng)絡(luò)請(qǐng)求的使用步驟:

    a. 創(chuàng)建任務(wù)對(duì)象

    b. 控制任務(wù)的執(zhí)行

    c. 在block或代理方法中獲得任務(wù)執(zhí)行的結(jié)果


支持的三種任務(wù):(任務(wù)的基類NSURLSessionTask)

     數(shù)據(jù)任務(wù)  使用NSURLSessionDataTask描述

     下載任務(wù)  使用NSURLSessionDownloadTask描述

     上傳任務(wù)  使用NSURLSessionUploadTask描述



  • 任務(wù)對(duì)象的

NSURLSession中的任務(wù)對(duì)象NSURLSessionTask,全部由NSURLSession對(duì)象創(chuàng)建

    強(qiáng)調(diào):異步操作不會(huì)阻塞當(dāng)前代碼的執(zhí)行,無(wú)法通過(guò)返回值或參數(shù)獲得結(jié)果

NSURLSessionTask任務(wù)對(duì)象的狀態(tài):

@property(readonly) NSURLSessionTaskState state
typedef NS_ENUM (NSInteger, NSURLSessionTaskState ) {
    NSURLSessionTaskStateRunning = 0,     // 運(yùn)行狀態(tài)
    NSURLSessionTaskStateSuspended = 1,   // 掛起狀態(tài)
    NSURLSessionTaskStateCanceling = 2, // 取消狀態(tài)
    NSURLSessionTaskStateCompleted = 3, // 完成狀態(tài)
};


當(dāng)一個(gè)任務(wù)對(duì)象被創(chuàng)建后,任務(wù)的狀態(tài)為掛起狀態(tài)

控制任務(wù)執(zhí)行(修改任務(wù)狀態(tài))的方法:

- (void)cancel     // 取消任務(wù)
- (void)resume     // 運(yùn)行任務(wù)
- (void)suspend    // 掛起任務(wù)


  • 數(shù)據(jù)任務(wù) — block方式獲得結(jié)果

數(shù)據(jù)任務(wù)創(chuàng)建:

- (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError*error))completionHandler

    在block中處理請(qǐng)求后的結(jié)果(響應(yīng)數(shù)據(jù)、響應(yīng)對(duì)象、錯(cuò)誤對(duì)象)

    如:發(fā)送一個(gè)GET請(qǐng)求,獲取指定游戲任務(wù)信息的JSON數(shù)據(jù)

NSString *urlStr = @"http://localhost/lolShow.php?number=20&from=0";
NSURL * url = [NSURL URLWithString:urlStr];
NSURLRequest * request = [NSURLRequest requestWithURL:url];
//創(chuàng)建數(shù)據(jù)任務(wù)
NSURLSession * session = [NSURLSession sharedSession];
NSURLSessionDataTask * dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * __nullable data, NSURLResponse * __nullable response, NSError * __nullable error) {
    if ( error ) {
        NSLog(@"1 %@", [error localizedDescription]);
        return ;
    }
    //將JSON數(shù)據(jù)序列化為OC對(duì)象
    NSArray * arr = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
    if ( error ) {
        NSLog(@"2 %@", [error localizedDescription]);
        return ;
    }
    //字典轉(zhuǎn)模型
    for (NSDictionary * dict in arr ) {
        AMHeroModel * model = [AMHeroModel heroModelWithDict:dict];
        [self.heroInfoArray addObject:model];
    }
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        [self stopLoading];//刷新UI
    }];
}];
//啟動(dòng)任務(wù)
[dataTask resume];



  • 數(shù)據(jù)任務(wù) — 代理方式獲得結(jié)果

數(shù)據(jù)任務(wù)的創(chuàng)建:

- (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request

NSURLSession的代理屬性

@property(readonly, retain) id< NSURLSessionDelegate > delegate

    涉及的代理協(xié)議: <NSURLSessionDelegate><NSURLSessionTaskDelegate>

          <NSURLSessionDataDelegate><NSURLSessionDownloadDelegate>


數(shù)據(jù)任務(wù)常用的代理方法:

//接收到應(yīng)答對(duì)象
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask*)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler
//接收到數(shù)據(jù)(可能執(zhí)行多次)
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask*)dataTask didReceiveData:(NSData *)data
//完成一個(gè)請(qǐng)求的應(yīng)答過(guò)程
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error

     


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI