十分鐘搭建主流框架_下拉/上拉刷新數(shù)據(jù)(OC)

本節(jié)主題(網(wǎng)絡(luò)部分-下拉/上拉刷新)

  • 源碼地址在文章末尾
  • 達(dá)成效果


    下拉刷新數(shù)據(jù)

    上拉加載更多數(shù)據(jù)

前言

  • 經(jīng)過十分鐘搭建主流框架_簡單的網(wǎng)絡(luò)部分(OC)的介紹猜丹,相信你已經(jīng)實(shí)現(xiàn)了基本的聯(lián)網(wǎng)獲取數(shù)據(jù)嫉柴,但只是粗糙的獲取了固定的數(shù)據(jù),下面就讓我們來實(shí)現(xiàn)下拉刷新和上拉加載更多吧榕栏。同樣,我們先來做準(zhǔn)備工作吧蕾各。

準(zhǔn)備工作

Github尋找優(yōu)秀的第三方刷新框架

  • 1.前人種樹扒磁,后人乘涼。有優(yōu)秀的第三方框架可以使用式曲,當(dāng)然是極好的妨托,可以大大提高我們的開發(fā)效率,如有特殊需求只能自己手寫就除外了


    Refresh
  • 2.查閱第三方框架的README文件(讀者自行閱讀)
  • 3.使用cocoapods集成到自己的項(xiàng)目中

刷新的基本實(shí)現(xiàn)思路

下拉刷新

  • 0.由于本文只關(guān)注功能的實(shí)現(xiàn)吝羞,先撇開原理兰伤,我們可以把刷新理解為從服務(wù)器加載最新的數(shù)據(jù)。
  • 1.在viewDidLoad初始化下拉刷新控件脆贵,并綁定下拉刷新(請求網(wǎng)絡(luò)數(shù)據(jù))的方法,當(dāng)觸發(fā)下拉刷新医清,便會調(diào)用loadData方法。self.tableView.header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadData)];
  • 2.在loadData內(nèi)實(shí)現(xiàn)請求網(wǎng)絡(luò)數(shù)據(jù)(詳見《十分鐘搭建主流框架_簡單的網(wǎng)絡(luò)部分(OC)》)卖氨。
  • 3.請求成功会烙,停止刷新控件[weakSelf.tableView.header endRefreshing];
  • 4.請求失敗负懦,停止刷新控件[weakSelf.tableView.header endRefreshing];

上拉加載更多

  • 0.由于我們的實(shí)現(xiàn)是MVC模式,可以簡單理解為:修改了模型的數(shù)據(jù)柏腻,View的界面展示也會隨之變化纸厉。
  • 1.定義‘頁碼’屬性(用于加載下一頁所要傳遞的參數(shù))@property (nonatomic,assign) NSInteger pn;
  • 2.初始化上拉刷新控件,并綁定上拉加載更多方法五嫂,當(dāng)觸發(fā)上拉加載事件颗品,便會調(diào)用loadMoreData方法。self.tableView.footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
  • 3.在loadMoreData內(nèi)實(shí)現(xiàn)加載更多數(shù)據(jù)的基本邏輯
    • (1)請求參數(shù)發(fā)生變化,加上params[@"pn"] = @(self.pn);
    • (2)在請求成功的block內(nèi)增加‘頁碼’weakSelf.pn ++;
    • (3)在請求成功的block內(nèi)使用新的模型數(shù)組接收數(shù)據(jù)NSArray *array = [CYXMenu objectArrayWithKeyValuesArray:responseObject[@"result"]];并拼接到原數(shù)組的尾部 [weakSelf.menus addObjectsFromArray:array];
    • (4)刷新表格[weakSelf.tableView reloadData];
    • (5)停止刷新控件[weakSelf.tableView.footer endRefreshing];

詳細(xì)實(shí)現(xiàn)步驟 上代碼

(一)下拉

  • setupTable內(nèi)初始化頭部刷新控件
    // 頭部刷新控件
    self.tableView.header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadData)];
    [self.tableView.header beginRefreshing];
  • 實(shí)現(xiàn)loadData方法
    /**
     *  發(fā)送請求并獲取數(shù)據(jù)方法
     */
    - (void)loadData{
        [self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];
        self.pn = 1;
        // 請求參數(shù)(根據(jù)接口文檔編寫)
        NSMutableDictionary *params = [NSMutableDictionary dictionary];
        params[@"menu"] = @"西紅柿";
        params[@"pn"] = @(self.pn);
        params[@"rn"] = @"10";
        params[@"key"] = @"2ba215a3f83b4b898d0f6fdca4e16c7c";

        // 在AFN的block內(nèi)使用沃缘,防止造成循環(huán)引用
        __weak typeof(self) weakSelf = self;

        [self.manager.responseSerializer setAcceptableContentTypes:[NSSet setWithObject:@"text/html"]];

        [self.manager GET:CYXRequestURL parameters:params success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
            NSLog(@"請求成功");

            // 利用MJExtension框架進(jìn)行字典轉(zhuǎn)模型
            weakSelf.menus = [CYXMenu objectArrayWithKeyValuesArray:responseObject[@"result"]];
            weakSelf.pn ++;
            // 刷新數(shù)據(jù)(若不刷新數(shù)據(jù)會顯示不出)
            [weakSelf.tableView reloadData];
            [weakSelf.tableView.header endRefreshing];
        } failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
            NSLog(@"請求失敗 原因:%@",error);
            [weakSelf.tableView.header endRefreshing];
        }];

    }

(二)上拉

  • setupTable內(nèi)初始化上拉刷新控件
    // 尾部刷新控件
    self.tableView.footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
  • 實(shí)現(xiàn)loadMoreData方法
    /**
     *  加載更多數(shù)據(jù)
     */
    - (void)loadMoreData{

        [self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];

        // 請求參數(shù)(根據(jù)接口文檔編寫)
        NSMutableDictionary *params = [NSMutableDictionary dictionary];
        params[@"menu"] = @"西紅柿";
        params[@"pn"] = @(self.pn);
        params[@"rn"] = @"10";
        params[@"key"] = @"2ba215a3f83b4b898d0f6fdca4e16c7c";

        // 在AFN的block內(nèi)使用躯枢,防止造成循環(huán)引用
        __weak typeof(self) weakSelf = self;

        [self.manager.responseSerializer setAcceptableContentTypes:[NSSet setWithObject:@"text/html"]];

        [self.manager GET:CYXRequestURL parameters:params success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
            // 利用MJExtension框架進(jìn)行字典轉(zhuǎn)模型
            NSArray *array = [CYXMenu objectArrayWithKeyValuesArray:responseObject[@"result"]];
            [weakSelf.menus addObjectsFromArray:array];
            weakSelf.pn ++;
            // 刷新數(shù)據(jù)(若不刷新數(shù)據(jù)會顯示不出)
            [weakSelf.tableView reloadData];
            [weakSelf.tableView.footer endRefreshing];
        } failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
            NSLog(@"請求失敗 原因:%@",error);
            [weakSelf.tableView.footer endRefreshing];
        }];
    }
  • 到這里已經(jīng)簡單實(shí)現(xiàn)了下拉與上拉刷新的功能,下次再討論更多的其他功能吧 _
  • 附:源碼github地址
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末槐臀,一起剝皮案震驚了整個(gè)濱河市锄蹂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌水慨,老刑警劉巖得糜,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異晰洒,居然都是意外死亡朝抖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門谍珊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來治宣,“玉大人,你說我怎么就攤上這事抬驴×镀撸” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵布持,是天一觀的道長豌拙。 經(jīng)常有香客問我,道長题暖,這世上最難降的妖魔是什么按傅? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮胧卤,結(jié)果婚禮上唯绍,老公的妹妹穿的比我還像新娘。我一直安慰自己枝誊,他們只是感情好况芒,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叶撒,像睡著了一般绝骚。 火紅的嫁衣襯著肌膚如雪耐版。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天压汪,我揣著相機(jī)與錄音粪牲,去河邊找鬼。 笑死止剖,一個(gè)胖子當(dāng)著我的面吹牛腺阳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播穿香,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼亭引,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扔水?” 一聲冷哼從身側(cè)響起痛侍,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎魔市,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赵哲,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡待德,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了枫夺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片将宪。...
    茶點(diǎn)故事閱讀 40,852評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖橡庞,靈堂內(nèi)的尸體忽然破棺而出较坛,到底是詐尸還是另有隱情,我是刑警寧澤扒最,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布丑勤,位于F島的核電站,受9級特大地震影響吧趣,放射性物質(zhì)發(fā)生泄漏法竞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一强挫、第九天 我趴在偏房一處隱蔽的房頂上張望岔霸。 院中可真熱鬧,春花似錦俯渤、人聲如沸呆细。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽絮爷。三九已至趴酣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間略水,已是汗流浹背价卤。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留渊涝,地道東北人慎璧。 一個(gè)月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像跨释,于是被迫代替她去往敵國和親胸私。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容

  • iOS網(wǎng)絡(luò)架構(gòu)討論梳理整理中鳖谈。岁疼。。 其實(shí)如果沒有APIManager這一層是沒法使用delegate的缆娃,畢竟多個(gè)單...
    yhtang閱讀 5,207評論 1 23
  • 在iOS開發(fā)中捷绒,我們經(jīng)常要用到下拉刷新和上拉刷新來加載新的數(shù)據(jù),當(dāng)前這也適合分頁贯要。iOS原生就帶有該方法暖侨,下面就i...
    Littleredguy閱讀 1,109評論 0 0
  • 原文 前言 本文為回答一位朋友關(guān)于MVC/MVP/MVVM架構(gòu)方面的疑問所寫, 旨在介紹iOS下MVC/MVP/M...
    無灃閱讀 711評論 1 2
  • iOS開發(fā)系列--網(wǎng)絡(luò)開發(fā) 概覽 大部分應(yīng)用程序都或多或少會牽扯到網(wǎng)絡(luò)開發(fā),例如說新浪微博崇渗、微信等字逗,這些應(yīng)用本身可...
    lichengjin閱讀 3,671評論 2 7
  • 在工程的橋接文件中添加如下代碼:(如何創(chuàng)建橋接文件:右鍵工程-->創(chuàng)建普通OC文件葫掉,名稱隨意起-->創(chuàng)建成功,會提...
    前端杜若閱讀 2,116評論 5 1