1.先上效果圖
2.先用青花瓷軟件獲取一個app的post請求鏈接
3.使用AFNetWorking實現對Http請求的封裝類 HttpTool
//這個方法可以post登錄
+(void)Post:(NSString *)URLString parameters:(id)parameters success:(void (^)(id))success failure:(void (^)(NSError *))failure
{
// 創建請求管理者
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
[mgr POST:URLString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
if (success) {
success(responseObject);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
if (failure) {
failure(error);
}
}];
}
parameters 為post請求body的參數 為oc對象
以下兩張寫法均可
NSDictionary *params = @{@"password" : @"1", @"username" : @"cr"};
NSDictionary *params = @{@"password" : @1, @"username" : @"cr"};
4.構造一個 StatusParam 表明post請求的參數模型對象
@property (nonatomic, copy) NSString *app;
@property (nonatomic, copy) NSString *backup;
@property (nonatomic, copy) NSString *client_id;
@property (nonatomic, copy) NSString *cver;
@property (nonatomic, copy) NSString *device_id;
@property (nonatomic, copy) NSString *device_token;
@property (nonatomic, copy) NSString *device_version;
@property (nonatomic, copy) NSString *id;
@property (nonatomic, copy) NSString *idfa;
@property (nonatomic, copy) NSString *open_udid;
/**
* 若指定此參數,則返回對應的數據,一次數據有10條
*/
@property (nonatomic, copy) NSString *p;
@property (nonatomic, copy) NSString *qudaoid;
@property (nonatomic, copy) NSString *size;
@property (nonatomic, copy) NSString *uuid;
@property (nonatomic, copy) NSString *ver;
@property (nonatomic, copy) NSString *via;
5.創建StatusResult類 對返回的數據進行處理
可能json有好幾層 有用的數據在里面的層
-(instancetype)initWithArr:(id)array
{
if(self = [super init])
{
NSDictionary *data = [array objectForKey:@"data"];
NSArray *dicArray = [data objectForKey:@"list"];
//字典轉模型
NSMutableArray *tmpArray = [NSMutableArray array];
for (NSDictionary *dic in dicArray) {
CZStatus *status = [[CZStatus alloc]initWithDic:dic];
[tmpArray addObject:status];
}
_statuses = tmpArray;
}
return self;
}
6.創建StatusTool工具類 block回調HttpTool基礎類,根據不同Param和url獲取不同的json反序列數據(AFN已經實現了反序列化的功能)
+ (void)newStatusWithSinceId:(NSString *)p success:(void (^)(NSArray *))success failure:(void (^)(NSError *))failure
{
// 創建參數模型
CZStatusParam *param = [[CZStatusParam alloc] init];
if (p) { // 有數據,才需要下拉刷新
param.p = p;
}
[CZHttpTool Post:@"http://v.higo.meilishuo.com/shop/get_more" parameters:param.keyValues success:^(id responseObject) {
CZStatusResult *result = [[CZStatusResult alloc] initWithArr:responseObject];
if(success)
{
success(result.statuses);
}
} failure:^(NSError *error) {
}];
}
7.創建 自定義UICollectViewControllercell 的Status模型類 .h中的屬性最好和獲取來的數據屬性的名字相同
-(instancetype)initWithDic:(NSDictionary*)dic
{
if(self = [super init]){
[self setValuesForKeysWithDictionary:dic];
}
return self;
}
+(instancetype)StatusWithDic:(NSDictionary*)dic
{
return [[self alloc] initWithDic:dic];
}
8.創建HighGoCollectionViewCell類 使用storyboard方式加載
使用storyboard方式加載 的話有兩個注意點
1.storyboard中cell的reuseIdentifier必須和代碼里的一致
2.代碼默認生成的注冊要注釋掉
// [self.collectionView registerClass:[HighGoCollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier];
重寫HighGoCollectionViewCell中的data屬性的set方法,減耦合
-(void) setData:(CZStatus *)data
{
_data = data;
//設置頭像的圓角 暫時用這種,這種性能不高
_group_header.layer.masksToBounds =YES;
[_group_header.layer setCornerRadius:75];
_group_header.layer.rasterizationScale=[UIScreen mainScreen].scale;
[_group_header sd_setImageWithURL:[NSURL URLWithString:_data.group_header] placeholderImage:[UIImage imageNamed:@"avatar1"]];
_group_name.text = _data.group_name;//名稱
_city.text = _data.city;//城市
_group_desc.text = _data.group_desc;//具體描述
}
9.最后一步,使用UICollectViewController 創建HighgoCollectionViewController類
首次加載,自動請求一次
上拉刷新請求一次
- (void)viewDidLoad {
[super viewDidLoad];
// // Register cell classes
// [self.collectionView registerClass:[HighGoCollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier];
[self loadNewStatus];
// 添加上拉刷新控件
[self.collectionView addFooterWithTarget:self action:@selector(loadNewStatus)];
}
請求一次數據,一次的數據量為10個
- (void)loadNewStatus
{
NSString *sinceId = @"1";
if (self.status.count) { // 有數據,才需要下拉刷新
sinceId = [NSString stringWithFormat:@"%lu",1+self.status.count/10];
}
[CZStatusTool newStatusWithSinceId:sinceId success:^(NSArray *statuses) { // 請求成功的Block
// 結束下拉刷新
[self.collectionView footerEndRefreshing];
// 模型轉換視圖模型 CZStatus -> CZStatusFrame
NSMutableArray *statusA = [NSMutableArray array];
for (CZStatus *a in statuses) {
[statusA addObject:a];
}
[self.status addObjectsFromArray:statusA];
// 刷新表格
[self.collectionView reloadData];
} failure:^(NSError *error) {
}];
}
數據源代理方法
#pragma mark <UICollectionViewDataSource>
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return self.status.count;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
HighGoCollectionViewCell *cell = (HighGoCollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
CZStatus *status = self.status[indexPath.row];
cell.data = status;
return cell;
}
如果要自定義frame 使用mvvm
如果還有哪些方面不足,請大家指教