准备工作

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. 【Java】Java-fastjson-基本使用方法

    Java-fastjson-基本使用方法 fastjson maven_百度搜索 Maven Repository: com.alibaba » fastjson » 1.2.44 fastjson ...

  2. 【Scala】Java-Scala-单例模式实现方法

    Java-Scala-单例模式实现方法 scala 单例_百度搜索 scala实现单例模式-博客-云栖社区-阿里云

  3. GIT 如何合并另一个远程Git仓库的文件到本地仓库里某个指定子文件夹并不丢失远程提交记录?

    问题背景:     最近在重新整理手中的一个项目,目前该项目分为PC项目,手机项目,某第三方接口项目,第三方接口服务项目和手机项目     因为之前规划的原因,原来的四个项目是分两个解决方案来管理的 ...

  4. (转)【风宇冲】Unity3D教程宝典之AssetBundles:第一讲

    自:http://blog.sina.com.cn/s/blog_471132920101gz8z.html 原创文章如需转载请注明:转载自风宇冲Unity3D教程学院                 ...

  5. 最小公倍数 SRM 661 Div1 250: MissingLCM

    Problem Statement The least common multiple (denoted "lcm") of a non-empty sequence of pos ...

  6. Spring 集成 redistemplate

    jar包 <version.clients.jedis>2.7.2</version.clients.jedis><version.data.redis>1.6.2 ...

  7. beanshell

    http://www.beanshell.org/download.html

  8. top高级技能

    默认输入top命令后进入的是交互模式,默认显示的TOP程序界面如下图所示: 我们注意到进程的内存区域数据很长一串,主要是因为这里用的单位是k表示的,我们可以修改显示的单位,在界面上直接输入E可以改变显 ...

  9. mysql的逻辑结构

    mysql 数据库的逻辑架构如下图: 第一层,即最上一层,所包含的服务并不是MySQL所独有的技术.它们都是服务于C/S程序或者是这些程序所需要的 :连接处理,身份验证,安全性等等. 第二层值得关注. ...

  10. Spring Boot 之 RESTfull API简单项目的快速搭建(一)

    1.创建项目 2.创建 controller IndexController.java package com.roncoo.example.controller; import java.util. ...