本節主題(簡單的網絡部分)
- 源碼地址在文章末尾
-
達成效果
效果圖 注:本文API使用HaoService數據平臺
前言
- 廢話不說了,簡單來說,移動網絡很重要,下面讓我們來實現一個簡單的Demo:對網絡數據的請求,并接收與展示吧。
注意:是簡單的!很簡單的!
準備工作
1.文件目錄結構示圖(按照MVC分層)
文件目錄結構圖/自定義Cell
Controller: CYXOneViewController
Model: CYXMenu
View: CYXCell
2.使用cocoapods集成第三方框架
注:這里就直接使用cocoapods插件安裝第三方框架了
第三方框架
- 這里要使用到的三方框架包括AFNetworking、MJExtension、SDWebImage
- 框架用途簡介
- AFNetworking:用于發送網絡請求
- MJExtension:用于把網絡返回的JSON格式數據轉換為模型屬性
- SDWebImage:用于下載網絡圖片
基本思路簡述
- 1.在
CYXOneViewController
中使用AFNetworking
發送GET
請求,得到服務器返回的JSON
格式的數據 - 2.使用
MJExtension
把JSON
格式的數據轉為模型CYXMenu
對應的屬性 - 3.在
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
方法內根據索引indexPath.row
把每一行Cell的Model屬性傳遞給自定義Cell(CYXCell
) - 4.在自定義Cell(
CYXCell
)內接收模型數據并初始化Cell的內部控件 - 5.不要忘記在AFN框架內的GET請求成功調用的block中刷新TableView的數據
詳細實現 上代碼
- 第一步:設計模型屬性(CYXMenu.h),這里的屬性名根據API文檔設計,本Demo只是使用了其中幾個簡單的
#import <Foundation/Foundation.h>
@interface CYXMenu : NSObject
/** 圖片 */
@property (copy, nonatomic) NSString * albums;
/** 標題 */
@property (nonatomic,copy) NSString *title;
/** 材料 */
@property (nonatomic,copy) NSString *ingredients;
@end
- 第二步:自定義cell(這里使用Xib了)
- 2.1 拖控件到Xib中(見文件目錄結構圖)
- 2.2 在
CYXCell.h
中定義一個模型屬性,用于供外界(CYXOneViewController)訪問并傳遞模型進來。
#import <UIKit/UIKit.h> @class CYXMenu; @interface CYXCell : UITableViewCell /** 菜單模型 */ @property (strong, nonatomic) CYXMenu * menu; @end
- 2.3 在
CYXCell.m
中實現menu屬性的- (void)setMenu:(CYXMenu *)menu
方法,將取到的menu模型值給cell自身的控件賦值
由于這里需要通過URL下載網絡圖片,使用到了SDWebImage框架
#import "CYXCell.h" #import "CYXMenu.h" #import <UIImageView+WebCache.h> @interface CYXCell () @property (weak, nonatomic) IBOutlet UIImageView *albumsImageView; @property (weak, nonatomic) IBOutlet UILabel *titleLable; @property (weak, nonatomic) IBOutlet UILabel *ingredientsLabel; @end @implementation CYXCell - (void)setMenu:(CYXMenu *)menu{ _menu = menu; // 利用SDWebImage框架加載圖片資源 [self.albumsImageView sd_setImageWithURL:[NSURL URLWithString:menu.albums]]; // 設置標題 self.titleLable.text = menu.title; // 設置材料數據 self.ingredientsLabel.text = menu.ingredients; } @end
- 第三步,到這里我們需要在
CYXOneViewController.m
內實現網絡數據請求
/JSON數據轉模型
/給自定義cell傳遞模型數據
的操作
#import "CYXOneViewController.h"
#import "CYXCell.h"
#import "CYXMenu.h"
#import <AFNetworking.h>
#import <MJExtension.h>
@interface CYXOneViewController ()
/** 存放數據模型的數組 */
@property (strong, nonatomic) NSMutableArray * menus;
@end
@implementation CYXOneViewController
#pragma mark - 全局常量
// 發送請求URL
static NSString * const CYXRequestURL = @"http://apis.haoservice.com/lifeservice/cook/query?";
// 重用cell標識符
static NSString * const CYXCellID = @"cell";
#pragma mark - life cycle 生命周期方法
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView.rowHeight = 90;
// 注冊重用Cell
[self.tableView registerNib:[UINib nibWithNibName:NSStringFromClass([CYXCell class]) bundle:nil] forCellReuseIdentifier:CYXCellID];
// 調用加載數據方法
[self loadData];
self.view.backgroundColor = [UIColor whiteColor];
}
#pragma mark - private methods 私有方法
/**
* 發送請求并獲取數據方法
*/
- (void)loadData{
// 請求參數(根據接口文檔編寫)
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"menu"] = @"西紅柿";
params[@"pn"] = @"1";
params[@"rn"] = @"20";
params[@"key"] = @"2ba215a3f83b4b898d0f6fdca4e16c7c";
// 在AFN的block內使用,防止造成循環引用
__weak typeof(self) weakSelf = self;
[[AFHTTPSessionManager manager] GET:CYXRequestURL parameters:params success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) {
NSLog(@"請求成功");
// 利用MJExtension框架進行字典轉模型
weakSelf.menus = [CYXMenu objectArrayWithKeyValuesArray:responseObject[@"result"]];
// 刷新數據(若不刷新數據會顯示不出)
[weakSelf.tableView reloadData];
} failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
NSLog(@"請求失敗 原因:%@",error);
}];
}
#pragma mark - UITableviewDatasource 數據源方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return self.menus.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
CYXCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
cell.menu = self.menus[indexPath.row];
return cell;
}
#pragma mark - UITableviewDelegate 代理方法
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
// 點擊了第indexPath.row行Cell所做的操作
}
@end
- 到這里只是簡單實現了網絡數據的請求,還有很多細節,例如下拉/上拉刷新,、cell的點擊事件等等,有時間再討論了。
- 附:源碼github地址