iOS通用分頁request

在項目中镀岛,分頁加載是家常便飯。下拉友驮,page重置漂羊,上拉,page+1卸留,雖說也挺簡單的走越,但是到處都需要處理page的代碼,就顯得有些分散和冗余耻瑟。由于我自己的項目是基于離散型api設(shè)計旨指,因此封裝了一套通用分頁的request赏酥,讓調(diào)用者盡量不用去考慮page的變化。

BaseRequest

前面提到離散型api谆构,簡單介紹一下裸扶。首先有個BaseRequest,在里面可以設(shè)置一些通用的配置搬素,比如token呵晨,appVersion等等,或者是超時時間熬尺。每個api都是一個request摸屠,都繼承于BaseRequest。

@interface BaseRequest : NSObject

@property (nonatomic, assign) BOOL isExcuting;
@property (nonatomic, assign) RequestPolicy requestPolicy;
@property (nonatomic, strong) NSError *responseError;
@property (nonatomic, strong) id responseJSONObject;
@property (nonatomic, weak) id<RequestDelegate> delegate;

- (instancetype)initWithDelegate:(id<RequestDelegate>)delegte;

// baseurl
- (NSString *)baseUrlString;

// relative url
- (NSString *)requestUrlString;

// 組裝參數(shù)
- (NSDictionary *)params;

// 默認為GET
- (RequestMethod)requestMethod;

- (RequestUploadMultiMediaBlock)constructingBodyBlock;

- (void)startRequest;

- (void)cancel;

@end

PageRequest

封裝分頁request猪杭,自然也是繼承于baseRequest了餐塘。屬性都比較清晰。

  • curPage:當(dāng)前page皂吮,
  • PageNumber:每頁拉取數(shù)戒傻,
  • isLastPage:是否是最后一頁,
  • pageType:加載更多 or 刷新蜂筹。
typedef NS_ENUM(NSInteger, PageType) {
    PageNoneType,
    PageRefresh,
    PageLoadMore
};

@interface PageRequest : BaseRequest

@property (nonatomic) NSInteger curPage;
@property (nonatomic) NSInteger pageNumber;
@property (nonatomic) PageType pageType;
@property (nonatomic, readonly) BOOL isLastPage;

// 失敗重置curPage
- (void)resetPageWhenFail;
@end

@implementation PageRequest

- (instancetype)initWithDelegate:(id<RequestDelegate>)delegte {
    if (self = [super initWithDelegate:delegte]) {
        _curPage = 1;
        _pageNumber = PAGENUMBER;
    }
    
    return self;
}

- (BOOL)isLastPage {
    if ([self.responseDataObject isKindOfClass:[NSDictionary class]]) {
        NSDictionary *dict = self.responseDataObject;
        NSString *next = [dict stringForKey:@"next"];
        if (!next || next.length == 0) {
            return YES;
        }
    }
    return NO;
}

// 失敗重置curPage
- (void)resetPageWhenFail {
    if (self.pageType == PageLoadMore) {
        if (self.curPage > 1) {
            self.curPage--;
        }
    }
}

// 組裝參數(shù)
- (NSDictionary *)params {
    NSDictionary *baseDict = [super params];
    NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:0];
    
    if (baseDict) {
        [dict addEntriesFromDictionary:baseDict];
    }
    
    if (self.pageType == PageRefresh) {
        self.curPage = 1;
    } else if (self.pageType == PageLoadMore) {
        self.curPage++;
    }
    
    dict[@"offset"] = @(self.curPage);
    dict[@"limit"] = @(self.pageNumber);
    
    return dict;
}
@end

調(diào)用

比如要加載導(dǎo)師列表需纳,先定義個GetMentorListRequest: PageRequest。

@implementation GetMentorListRequest
- (NSString *)requestUrlString {
    return @"/mentors/";
}

// 組裝參數(shù)
- (NSDictionary *)params {
    NSDictionary *pageDict = [super params];
    NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:0];
    
    if (pageDict) {
        [dict addEntriesFromDictionary:pageDict];
    }

    if (self.industryId) {
        dict[@"industry"] = self.industryId;
    }
    
    return dict;
}
@end

在model層封裝調(diào)用艺挪。注意一點不翩,在請求失敗的時候,要注意將page回置麻裳。

// 獲取導(dǎo)師列表
- (void)getMentorList:(NSNumber *)industryId pageType:(PageType)type {
    self.getMentorListRequest.industryId = industryId;
    self.getMentorListRequest.pageType = type;
    
    [self.getMentorListRequest startRequest];
}

- (void)refresh {
    [self getMentorList:self.industryId pageType:PageRefresh];
}

- (void)loadMore {
    [self getMentorList:self.industryId pageType:PageLoadMore];
}

#pragma mark - rsp
- (void)handleFailedResult:(BaseRequest *)request {
    if ([request isKindOfClass:[GetMentorListRequest class]]) {
        GetMentorListRequest *getMentorListRequest = (GetMentorListRequest *)request;
        
        // 重置curpage
        [getMentorListRequest resetPageWhenFail];
    }
}

這樣調(diào)用者就完全不用關(guān)心page了口蝠。對于集中型的網(wǎng)絡(luò)請求,就需要在各自的數(shù)據(jù)管理類中記錄page津坑,然后進行更新妙蔗。

當(dāng)然,如果你非要自己去手動管理的話疆瑰,那就這樣眉反。自己去控制page,pageNum穆役。

- (void)getMentorList:(NSNumber *)industryId page:(NSInteger)page
              pageNum:(NSInteger)pageNum {
    
    self.getMentorListRequest.industryId = industryId;
    self.getMentorListRequest.curPage = page;
    self.getMentorListRequest.pageNumber = pageNum;
    
    [self.getMentorListRequest startRequest];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末匕坯,一起剝皮案震驚了整個濱河市莉御,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌夫椭,老刑警劉巖佣耐,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機叭莫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烁试,“玉大人,你說我怎么就攤上這事拢肆〖跸欤” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵郭怪,是天一觀的道長支示。 經(jīng)常有香客問我,道長鄙才,這世上最難降的妖魔是什么颂鸿? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮攒庵,結(jié)果婚禮上嘴纺,老公的妹妹穿的比我還像新娘。我一直安慰自己浓冒,他們只是感情好栽渴,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著稳懒,像睡著了一般闲擦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上场梆,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天墅冷,我揣著相機與錄音,去河邊找鬼或油。 笑死寞忿,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的装哆。 我是一名探鬼主播罐脊,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蜕琴!你這毒婦竟也來了萍桌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤凌简,失蹤者是張志新(化名)和其女友劉穎上炎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡藕施,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年寇损,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裳食。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡矛市,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诲祸,到底是詐尸還是另有隱情浊吏,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布救氯,位于F島的核電站找田,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏着憨。R本人自食惡果不足惜墩衙,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望甲抖。 院中可真熱鬧漆改,春花似錦、人聲如沸惧眠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽氛魁。三九已至暮顺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秀存,已是汗流浹背捶码。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留或链,地道東北人惫恼。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像澳盐,于是被迫代替她去往敵國和親祈纯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

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