准备工作

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.使用MJExtensionJSON格式的数据转为模型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 = ; // 注册重用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)框架的更多相关文章

  1. vue-cli+webpack搭建简单的vue项目框架

    0.先去官网下载安装nodeJS 1.在cmd中输入命令 node -version    若出现node版本号 则安装成功 2.通过命令:cd 文件夹名     进入某具体文件夹后进行如下命令操作: ...

  2. [angularjs] MVC + Web API + AngularJs 搭建简单的 CURD 框架

    MVC + Web API + AngularJs 搭建简单的 CURD 框架 GitHub 地址:https://github.com/liqingwen2015/Wen.MvcSinglePage ...

  3. SpringMVC笔记——SSM框架搭建简单实例

    落叶枫桥 博客园 首页 新随笔 联系 订阅 管理 SpringMVC笔记——SSM框架搭建简单实例 简介 Spring+SpringMVC+MyBatis框架(SSM)是比较热门的中小型企业级项目开发 ...

  4. 动端逐渐出了许多的移动端的框架,比如Sencha Touch、JQTouch、Jquery-moblie、jqMobi等等。这些框架都有优缺点,不同的框架应用在不同的项目中。现简单阐述一下各框架的优缺点:

    移动前端工作的那些事---前端制作之微信小技巧篇   (2013-11-15 15:20) 转载▼ 标签: it css3/javascript html5 webapp 手机网站搭建 分类: 前端制 ...

  5. 拿nodejs快速搭建简单Oauth认证和restful API server攻略

    拿nodejs快速搭建简单Oauth认证和restful API server攻略:http://blog.csdn.net/zhaoweitco/article/details/21708955 最 ...

  6. 模糊系统架构和简单实现--AForge.NET框架的使用(四)

    原文:模糊系统架构和简单实现--AForge.NET框架的使用(四) 先说一下,为什么题目是简单实现,因为我实在没有弄出好的例子. 我原来用AForge.net做的项目中的模糊系统融入了神经网络和向量 ...

  7. 用SpringBoot搭建简单电商项目 01

    前几节呢,我们已经简单介绍了SpringBoot框架的使用,从这一节开始,我们尝试着使用SpringBoot框架来一步一步搭建一个简单电商项目.当然了,这不是真正的电商项目,你可以看成是一个CRUD案 ...

  8. 搭建SpringBoot+dubbo+zookeeper+maven框架(二)

    上一篇文章是关于搭建SpringBoot+dubbo+zookeeper+maven框架的,但是里面的功能还不够完善,今天就日志管理方面做一些改善. 下了demo的网友可能会发现项目在启动时会有警告: ...

  9. Unity 游戏框架搭建 2018 (一) 架构、框架与 QFramework 简介

    约定 还记得上版本的第二十四篇的约定嘛?现在出来履行啦~ 为什么要重制? 之前写的专栏都是按照心情写的,在最初的时候笔者什么都不懂,而且文章的发布是按照很随性的一个顺序.结果就是说,大家都看完了,都还 ...

随机推荐

  1. awk的基本使用方法

    awk是处理文本文件的一个应用程序,几乎所有 Linux 系统都自带这个程序. 它依次处理文件的每一行,并读取里面的每一个字段.对于日志.CSV 那样的每行格式相同的文本文件,awk可能是最方便的工具 ...

  2. w3cscholl的在线代码编辑工具

    https://www.w3cschool.cn/tryrun/runcode?lang=c

  3. MySQL数据库localhost的root用户登陆遭遇失败

    问题:Access denied for user 'root'@'localhost' (using password: YES)打开MySQL目录下的my.ini文件(Linux的话是/etc/m ...

  4. (转)mobile cpu上禁用alpha test的相关总结

    转自:http://www.cnblogs.com/TracePlus/p/4037165.html 因为,每家芯片的特性不同,根据向framebuffer写法的不同,分为tile-based的mob ...

  5. Get file extention in XSLT

      When working with data view web parts or data form web parts in SharePoint, you might want to use ...

  6. GIF添加3D加速

    由于浏览器内核对Gif格式的图片会产生卡的情况,所以我们需要告诉浏览器,开启一下加速,方法很简单,就是利用css3的特性,强制告诉浏览器,这是个元素,需要3D转换,请务必开启加速效果 方法1 给gif ...

  7. mac 苹果鼠标 magic mouse2 当触摸代替点击当触摸板教程

    本文解决 mac 苹果鼠标 magic mouse2 触摸代替点击,鼠标当触摸板教程 买了magic mouse2之后,发现官方不推荐使用触摸代替点击,我感觉很不爽,这不就是一个触摸板嘛,于是各种搜软 ...

  8. 准备Mahout所用的向量ApplesToVectors

    <strong><span style="font-size:18px;">/*** * @author YangXin * @info 准备Mahout所 ...

  9. OpenWRT下实现Portal认证(WEB认证)

    首先简单介绍一下什么是Portal认证,Portal认证,通常也会叫Web认证,未认证用户上网时,设备强制用户登录到特定站点,用户可以免费访问其中的服务.当用户需要使用互联网中的其它信息时,必须在门户 ...

  10. Mat类具体解释(二)

    Mat::~Mat Mat的析构函数. C++: Mat::~Mat() 析构函数调用Mat::release(). Mat::operator = 提供矩阵赋值操作. C++: Mat& M ...