十分鐘搭建主流框架_簡單的網絡部分(OC)

本節主題(簡單的網絡部分)

  • 源碼地址在文章末尾
  • 達成效果


    效果圖
  • 注:本文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.使用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 = 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地址
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容