ios循環請求數據的正確方法

在使用AFNewWorking做數據解析時,有時會需要對得到的數據進行判斷,滿足條件時會根據得到的參數繼續請求,也就是需要通過循環的方式一層一層的向下獲取,而且每一層都有我們需要的數據,但是不完整,需要進行到最後一層時,才能得到我們所需的完整數據。這個時候,單純的使用for循環或者forin循環,會出現各種的問題,在這裏記錄一些我遇到需要逐層多次請求時用到的方法。

舉個例子,比如說你寫一個看書的應用,從某些應用中抓取的書籍章節列表一次只能返回50章,這時候你由於某些原因,無法用刷新的方式一次次去得到這些章節列表,要求一次性的傳回所有的列表,在類似這種情況下的解決方法。


想要一次性傳回所有的數據,而且是在多層AFNetWotking下得到我們想要的,我想到最好的方法就是block回調,將得到數據一層一層的村道一個數組中,通過在請求裏判斷,只要滿足某些條件,直接block();

首先,創建一個無返回值的方法,類似如下

+ (void)GetDataArrayTask:(void (^)(NSMutableArray *urlArray, NSError *error))block NeedUrl_ArrWithJsonTypeUrlString:(NSString *)needUrl Cookie:(NSString *)ac_cookie ServerID:(NSInteger)serverID

將所需要的參數添加進來,然後block回調的數組,就是最終得到的包含全部數據的完整數組;
然後,還需要創建一個類似的方法,多次循環的時候去用,類似如下

+ (void )nextData_Arr:(void(^)(NSMutableArray *urlArray))black NeedUrl:(NSString *)needUrl Cookie:(NSString *)ac_cookie ServerID:(NSInteger)serverID

通過這兩個方法得到的數據一次次進行累加,最終的到完整的數據,由於使用的是類方法,這時需要聲明一個全局的單例
static NSMutableArray *imageUrlArr = nil;創建你需要將得到數據存入的一個數組,在第一個方法裏進行初始化

總體實現的原理是在外部調用第一個方法,正在block中得到完整的數據,在第一個方法中通過判斷調用第二個方法,然後再在第二個方法中判斷,滿足條件時繼續調用第二個方法,知道得到完整的數據,然後返回給第一個方法,最後第一個方法中block();所有的數據
代碼如下:

以獲取圖片爲例,代碼可能不是很完整,主要記錄的是整體的思路和流程

+ (void)GetDataArrayTask:(void (^)(NSMutableArray *urlArray, NSError *error))block NeedUrl_ArrWithJsonTypeUrlString:(NSString *)needUrl Cookie:(NSString *)ac_cookie ServerID:(NSInteger)serverID
{
//由於使用的類方法,故訪問全局的在上面聲明一個單例
    if (!imageUrlArr)
    {
        imageUrlArr = [[NSMutableArray alloc] init];
    }else{
        if (imageUrlArr.count > 0)
        {
            [imageUrlArr removeAllObjects];
        }
    }

    __block AFHTTPRequestOperationManager *getImageArrayManager = [AFHTTPRequestOperationManager manager];

    AFJSONRequestSerializer * getImageArrayRequestSerializer = [AFJSONRequestSerializer serializer];
    getImageArrayRequestSerializer.timeoutInterval = TIMEOUTINTERVAL;


    getImageArrayManager.requestSerializer = getImageArrayRequestSerializer;
    getImageArrayManager.responseSerializer = [AFHTTPResponseSerializer serializer];
    //第一次的請求,此請求只走一次,爲了最終將完整的圖片地址返回給需要的地方
    [getImageArrayManager GET:needUrl parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

        if (responseObject) {
            id dataId = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil]nil;
            if ([dataId isKindOfClass:[NSArray class]])
                                {
                                    if (滿足條件將圖片存入數組)
                                    {
                                        for (NSDictionary *dict in (NSArray *)dataId) {

                                            [imageUrlArr addObject:imageUrlStr];
                                            //裏面先加入一部分圖片的地址,此時如果不完整,繼續走另一個方法
                                        }
                                    }
                                }

                                if (數據不完整時)
                                {
                                    NSString *NextUrl = 下一頁的地址;//請求需要的下一頁地址

                                    [Common nextComicImageUrl_Arr:^(NSMutableArray *imageArray) {
                                        block(imageArray , nil);//這裏等到第二個方法有返回的時候纔會走,此時已經將所有的圖片都存儲到數組中,然後返回
                                    } ComicStrUrl:NextUrl SearchCookie:ac_cookie ServerID:serverID];
                                }else{
                                    if (block) {
                                        block(imageUrlArr , nil);//如果已經完整,直接返回
                                    }
                                }
        }



    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        dispatch_async(dispatch_get_main_queue(), ^{
            if (block) {
                block([NSMutableArray array] , nil);
            }
        });
    }];

}

獲取下一頁網址的圖片數據
+ (void )nextData_Arr:(void(^)(NSMutableArray urlArray))black NeedUrl:(NSString )nextUrl Cookie:(NSString *)ac_cookie ServerID:(NSInteger)serverID
{
__block AFHTTPRequestOperationManager *getImageArrayManager = [AFHTTPRequestOperationManager manager];

AFJSONRequestSerializer * getImageArrayRequestSerializer = [AFJSONRequestSerializer serializer];
getImageArrayRequestSerializer.timeoutInterval = TIMEOUTINTERVAL;


getImageArrayManager.requestSerializer = getImageArrayRequestSerializer;
getImageArrayManager.responseSerializer = [AFHTTPResponseSerializer serializer];

[getImageArrayManager GET:nextUrl  parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

    if (responseObject) {
        id dataId = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil]nil;
        if ([dataId isKindOfClass:[NSArray class]])
                            {
                                if (serverConfig.downloadOfChooseList.downloadOfIsJson.downloadInfoObjectForKey_KeysArray.count > 4)
                                {
                                    for (NSDictionary *dict in (NSArray *)dataId) {

                                        [imageUrlArr addObject:imageUrlStr];//繼續將圖片地址存入數組中
                                    }
                                }
                            }

                            if (數據不完整時)
                            {
                                NSString *NextUrl = 下一頁的地址;
                                //當獲得的數據不完整,繼續調用此方法
                                [Common nextComicImageUrl_Arr:^(NSMutableArray *imageArray) {
                                if (滿足數據完整時) {
                                    black(imageUrlArr);//數據完整,直接返回給上一個方法,由上一個方法回調給需要使用的地方
                                }
                            } ComicStrUrl:comicStrUrl SearchCookie:ac_cookie ServerID:serverID];
                            }else{
                                if (block) {
                                    block(imageUrlArr);//數據完整了就進行返回
                                }
                            }
    }



} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    dispatch_async(dispatch_get_main_queue(), ^{
        if (block) {
            block([NSMutableArray array] , nil);
        }
    });
}];

}

這裏使用的還是AF2.X,主要想要理解的還是這裏面相互循環獲取數據的一個方式

發佈了26 篇原創文章 · 獲贊 7 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章