iOS通用分页request

作者: 微微笑的蜗牛 | 来源:发表于2016-11-30 21:25 被阅读461次

在项目中,分页加载是家常便饭。下拉,page重置,上拉,page+1,虽说也挺简单的,但是到处都需要处理page的代码,就显得有些分散和冗余。由于我自己的项目是基于离散型api设计,因此封装了一套通用分页的request,让调用者尽量不用去考虑page的变化。

BaseRequest

前面提到离散型api,简单介绍一下。首先有个BaseRequest,在里面可以设置一些通用的配置,比如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;

// 组装参数
- (NSDictionary *)params;

// 默认为GET
- (RequestMethod)requestMethod;

- (RequestUploadMultiMediaBlock)constructingBodyBlock;

- (void)startRequest;

- (void)cancel;

@end

PageRequest

封装分页request,自然也是继承于baseRequest了。属性都比较清晰。

  • curPage:当前page,
  • PageNumber:每页拉取数,
  • 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--;
        }
    }
}

// 组装参数
- (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

调用

比如要加载导师列表,先定义个GetMentorListRequest: PageRequest。

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

// 组装参数
- (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层封装调用。注意一点,在请求失败的时候,要注意将page回置。

// 获取导师列表
- (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];
    }
}

这样调用者就完全不用关心page了。对于集中型的网络请求,就需要在各自的数据管理类中记录page,然后进行更新。

当然,如果你非要自己去手动管理的话,那就这样。自己去控制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];
}

相关文章

网友评论

    本文标题:iOS通用分页request

    本文链接:https://www.haomeiwen.com/subject/wswtmttx.html