在項目中镀岛,分頁加載是家常便飯。下拉友驮,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];
}