搭建简单的网络部分(OC)框架

准备工作
1.文件目录结构示图(按照MVC分层)

Controller: CYXOneViewControllerModel: CYXMenuView: 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 简介
约定 还记得上版本的第二十四篇的约定嘛?现在出来履行啦~ 为什么要重制? 之前写的专栏都是按照心情写的,在最初的时候笔者什么都不懂,而且文章的发布是按照很随性的一个顺序.结果就是说,大家都看完了,都还 ...
随机推荐
- wifidog 源码初分析(1)-转
wifidog 的核心还是依赖于 iptables 防火墙过滤规则来实现的,所以建议对 iptables 有了了解后再去阅读 wifidog 的源码. 在路由器上启动 wifidog 之后,wifid ...
- 下周二推出“音视频技术WebRTC初探”公开课,欢迎捧场!
下周二推出"音视频技术WebRTC初探"公开课,欢迎捧场! 公开课课程链接:http://edu.csdn.net/huiyiCourse/detail/90 课程的解说资料 ...
- Authentication and Authorization in ASP.NET Web API
You've created a web API, but now you want to control access to it. In this series of articles, we ...
- oauth2-server-php-docs 食谱
一步一步的演练 以下说明提供详细的演练,以帮助您启动并运行OAuth2服务器.要查看实现此库的现有OAuth2服务器的代码库,请查看OAuth2 Demo. 初始化您的项目 为您的项目创建一个目录,并 ...
- 抽屉柜式MCC柜中PROFIBUS设备推荐波特率及相应传输距离
抽屉柜式MCC柜中PROFIBUS设备推荐波特率及相应传输距离.例如以下图所看到的: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L ...
- 创建Maven Module时报错:The parent project must have a packaging type of POM
创建Maven Module时报错:The parent project must have a packaging type of POM 解决的办法,是把父项目的Packaging改成pom:
- android中RecyclerView控件的使用
1.RecyclerView控件不在标准的库里面,需要先引入,引入比较简单,点击控件右边的下载按钮即可 2.先添加一个新闻实体类,用来为新闻列表提供数据,news.java: package com. ...
- angular5 基于ngx-translate实现多语言切换
angular的坑永远都是那么多,当然了,主要还是我太菜~ 基于ngx-translate实现多语言切换这个功能,我又是折腾了很久,下面是我实现的过程: 1.安装ngx-translate 需要安装@ ...
- Web安全 之 X-Frame-Options响应头配置
最近项目处于测试阶段,在安全报告中存在" X-Frame-Options 响应头缺失 "问题,显示可能会造成跨帧脚本编制攻击,如下图: X-Frame-Options: 值有三个: ...
- 查看JAVA的class二进制文件的方法
hexdump -C filename可以查看二进制文件. 比如java的Test.java public class Test{ public static void main(String[] a ...