搭建简单的网络部分(OC)框架
准备工作
1.文件目录结构示图(按照MVC分层)
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; @end2.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 = ; // 注册重用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"] = @"";
params[@"rn"] = @"";
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地址
搭建简单的网络部分(OC)框架的更多相关文章
- vue-cli+webpack搭建简单的vue项目框架
0.先去官网下载安装nodeJS 1.在cmd中输入命令 node -version 若出现node版本号 则安装成功 2.通过命令:cd 文件夹名 进入某具体文件夹后进行如下命令操作: ...
- [angularjs] MVC + Web API + AngularJs 搭建简单的 CURD 框架
MVC + Web API + AngularJs 搭建简单的 CURD 框架 GitHub 地址:https://github.com/liqingwen2015/Wen.MvcSinglePage ...
- SpringMVC笔记——SSM框架搭建简单实例
落叶枫桥 博客园 首页 新随笔 联系 订阅 管理 SpringMVC笔记——SSM框架搭建简单实例 简介 Spring+SpringMVC+MyBatis框架(SSM)是比较热门的中小型企业级项目开发 ...
- 动端逐渐出了许多的移动端的框架,比如Sencha Touch、JQTouch、Jquery-moblie、jqMobi等等。这些框架都有优缺点,不同的框架应用在不同的项目中。现简单阐述一下各框架的优缺点:
移动前端工作的那些事---前端制作之微信小技巧篇 (2013-11-15 15:20) 转载▼ 标签: it css3/javascript html5 webapp 手机网站搭建 分类: 前端制 ...
- 拿nodejs快速搭建简单Oauth认证和restful API server攻略
拿nodejs快速搭建简单Oauth认证和restful API server攻略:http://blog.csdn.net/zhaoweitco/article/details/21708955 最 ...
- 模糊系统架构和简单实现--AForge.NET框架的使用(四)
原文:模糊系统架构和简单实现--AForge.NET框架的使用(四) 先说一下,为什么题目是简单实现,因为我实在没有弄出好的例子. 我原来用AForge.net做的项目中的模糊系统融入了神经网络和向量 ...
- 用SpringBoot搭建简单电商项目 01
前几节呢,我们已经简单介绍了SpringBoot框架的使用,从这一节开始,我们尝试着使用SpringBoot框架来一步一步搭建一个简单电商项目.当然了,这不是真正的电商项目,你可以看成是一个CRUD案 ...
- 搭建SpringBoot+dubbo+zookeeper+maven框架(二)
上一篇文章是关于搭建SpringBoot+dubbo+zookeeper+maven框架的,但是里面的功能还不够完善,今天就日志管理方面做一些改善. 下了demo的网友可能会发现项目在启动时会有警告: ...
- Unity 游戏框架搭建 2018 (一) 架构、框架与 QFramework 简介
约定 还记得上版本的第二十四篇的约定嘛?现在出来履行啦~ 为什么要重制? 之前写的专栏都是按照心情写的,在最初的时候笔者什么都不懂,而且文章的发布是按照很随性的一个顺序.结果就是说,大家都看完了,都还 ...
随机推荐
- 【Java】Java-fastjson-基本使用方法
Java-fastjson-基本使用方法 fastjson maven_百度搜索 Maven Repository: com.alibaba » fastjson » 1.2.44 fastjson ...
- 【Scala】Java-Scala-单例模式实现方法
Java-Scala-单例模式实现方法 scala 单例_百度搜索 scala实现单例模式-博客-云栖社区-阿里云
- GIT 如何合并另一个远程Git仓库的文件到本地仓库里某个指定子文件夹并不丢失远程提交记录?
问题背景: 最近在重新整理手中的一个项目,目前该项目分为PC项目,手机项目,某第三方接口项目,第三方接口服务项目和手机项目 因为之前规划的原因,原来的四个项目是分两个解决方案来管理的 ...
- (转)【风宇冲】Unity3D教程宝典之AssetBundles:第一讲
自:http://blog.sina.com.cn/s/blog_471132920101gz8z.html 原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 ...
- 最小公倍数 SRM 661 Div1 250: MissingLCM
Problem Statement The least common multiple (denoted "lcm") of a non-empty sequence of pos ...
- Spring 集成 redistemplate
jar包 <version.clients.jedis>2.7.2</version.clients.jedis><version.data.redis>1.6.2 ...
- beanshell
http://www.beanshell.org/download.html
- top高级技能
默认输入top命令后进入的是交互模式,默认显示的TOP程序界面如下图所示: 我们注意到进程的内存区域数据很长一串,主要是因为这里用的单位是k表示的,我们可以修改显示的单位,在界面上直接输入E可以改变显 ...
- mysql的逻辑结构
mysql 数据库的逻辑架构如下图: 第一层,即最上一层,所包含的服务并不是MySQL所独有的技术.它们都是服务于C/S程序或者是这些程序所需要的 :连接处理,身份验证,安全性等等. 第二层值得关注. ...
- Spring Boot 之 RESTfull API简单项目的快速搭建(一)
1.创建项目 2.创建 controller IndexController.java package com.roncoo.example.controller; import java.util. ...