利用RAC一句話實現(xiàn)上拉下拉刷新

最近在研究上拉刷新下拉刷新,有點小心得和大家分享下箩绍。

首先我是先在網(wǎng)上搜博客看憔辫,發(fā)現(xiàn)要不就是用原生UIRefreshControl要不就是第三方庫的教程,這都不是我想要的(好的開源庫推薦MJRefresh)金顿。

于是我開始看大神們的源代碼臊泌,了解了下原理。

刷新原理

首先上拉下拉刷新肯定是基于UIScrollView的基礎上的揍拆,包括UITableView其實也是一個UIScrollView渠概。而實現(xiàn)上拉下拉刷新的原理就是UIScrollView中的代理方法

- (void)scrollViewDidScroll:(UIScrollView *)scrollView;// any offset changes

這個方法是在你的scrollView滾動時就會執(zhí)行的方法。

這里有必要說明下scrollView的兩個屬性嫂拴,一個是contentSize高氮,一個是contentOffset慧妄。這里上圖片講解可能直觀一點。

wait
wait

PS:不會用mac的畫圖工具比較丑見諒剪芍。

看圖塞淹,這里的綠色框就是我們的手機屏幕,我們的UI都是呈現(xiàn)在手機屏幕上的罪裹,那么黑色的框就是contentSize饱普。就是說,雖然手機屏幕只有一點大状共,但是我們的scrollView并不是只有一點大的套耕,這個屬性是可以設置的,而我們滾動scrollView其實就是滾動黑色框峡继,這樣看到的界面就會不一樣了冯袍。而圖上標注的紅點就是contentOffset。contentOffset是一個CGPoint碾牌,代表當前屏幕所在位置左上角相對于scrollView.contentSize左上角的橫縱坐標值康愤。

了解了scrollView我們就來說刷新。在
- (void)scrollViewDidScroll:(UIScrollView *)scrollView;// any offset changes方法中我們應該監(jiān)聽contentOffset的值舶吗,如果他的縱坐標到某個點以上我們就執(zhí)行刷新數(shù)據(jù)征冷,移動到某個點以下我們就執(zhí)行加載數(shù)據(jù)。具體看代碼可能更好理解誓琼。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{
if ([scrollView isEqual:_tableView]) {
    if (scrollView.contentOffset.y < -50 ) {
    //下拉刷新方法
    }
    if (scrollView.contentOffset.y > 800 ) {
    //上拉加載方法
    }
  }
}

原理很簡單检激,但是實現(xiàn)的話還是有很多細節(jié)需要考慮的,比如scrollView.contentOffset.y < -50的情況是很多的腹侣,當用戶快速上拉到-100時叔收,可能在-51執(zhí)行一次刷新方法,在-52執(zhí)行一次傲隶,-53執(zhí)行一次今穿。。伦籍。。腮出。帖鸦。這肯定是不合理的。

所以我們需要節(jié)流胚嘲。這里提兩個我的個人觀點作儿,一個是開線程執(zhí)行刷新辦法,如果線程存在不會新開一個馋劈,這樣可以保證刷新方法執(zhí)行一次攻锰。還有一種是用KVO監(jiān)聽用戶手指松開的動作晾嘶,松開的時候再刷新,或者- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate用這個代理方法娶吞,他會幫你監(jiān)聽手指是否松開垒迂。這兩個方法我都沒試過,大家可以自己嘗試下妒蛇,有錯希望反饋給我机断,共同進步。

但是如果僅僅是判定松開我覺得是滿足不了需求的绣夺。我現(xiàn)在希望就是當用戶快下滑到底部時就自動加載新數(shù)據(jù)吏奸,那我應該怎么實現(xiàn)呢?總不能用戶一拉到底不松手就不加載吧陶耍。

RAC一個方法實現(xiàn)刷新

我想到了RAC奋蔚。這個想法可能有點非主流,所以肯定有邏輯考慮不周的地方烈钞,希望各位指出泊碑。這里我先宏定義了下,為了縮短代碼

#define VIEWHEIGHT self.view.frame.size.height

然后就是RAC了棵磷。

[[[RACObserve(self.tableView, contentOffset) map:^id(id value) {
    if (self.tableView.contentOffset.y < -50) {
        return @"1";
    }
    if (self.tableView.contentOffset.y > self.tableView.contentSize.height - VIEWHEIGHT * 1.5 && self.tableView.contentSize.height - VIEWHEIGHT * 1.5 > 0) {
        return @"2";
    }else{
        return @"0";
    }
}] distinctUntilChanged] subscribeNext:^(id x) {
    debugLog(@"%@", x);
    if ([x integerValue] == 1) {
        [self netWork];
    }else if ([x integerValue] == 2){
        [self loadMoreData];
    }
}];

這里是用了RAC KVO的寫法蛾狗,不會的可以點我文章復習下。首先寫了一個通知監(jiān)聽tableView的contentOffset仪媒,如果發(fā)生變化立刻進入map產(chǎn)生的映射中執(zhí)行map中的方法沉桌。我給情況分了類,如果用戶下拉算吩,返回1留凭,如果上拉快到底部時返回2。并且在映射完成后用了distinctUntilChanged屬性偎巢,當我的映射值不產(chǎn)生變化時是不會傳遞映射值的蔼夜。這樣當用戶拉倒需要刷新的位置,只會發(fā)一個信號給訂閱者压昼,只會執(zhí)行一次刷新數(shù)據(jù)的方法求冷,這樣我所有的需求就迎刃而解了。

如果有更好的辦法希望大家給我指出窍霞,謝謝大家匠题。也歡迎來我的博客看看

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市但金,隨后出現(xiàn)的幾起案子韭山,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钱磅,死亡現(xiàn)場離奇詭異梦裂,居然都是意外死亡,警方通過查閱死者的電腦和手機盖淡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門年柠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人禁舷,你說我怎么就攤上這事彪杉。” “怎么了牵咙?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵派近,是天一觀的道長。 經(jīng)常有香客問我洁桌,道長渴丸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任另凌,我火速辦了婚禮谱轨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吠谢。我一直安慰自己土童,他們只是感情好,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布工坊。 她就那樣靜靜地躺著献汗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪王污。 梳的紋絲不亂的頭發(fā)上罢吃,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機與錄音昭齐,去河邊找鬼尿招。 笑死,一個胖子當著我的面吹牛阱驾,可吹牛的內(nèi)容都是我干的就谜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼里覆,長吁一口氣:“原來是場噩夢啊……” “哼丧荐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起租谈,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后割去,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窟却,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年呻逆,在試婚紗的時候發(fā)現(xiàn)自己被綠了夸赫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡咖城,死狀恐怖茬腿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宜雀,我是刑警寧澤切平,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站辐董,受9級特大地震影響悴品,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜简烘,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一苔严、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧孤澎,春花似錦届氢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至姐扮,卻和暖如春絮供,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背茶敏。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工壤靶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惊搏。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓贮乳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親恬惯。 傳聞我的和親對象是個殘疾皇子向拆,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

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