回調(diào)(callback)

回調(diào)(callback)就是講一段可執(zhí)行的代碼和一個(gè)特定的事件綁定起來(lái)。當(dāng)特定的事件發(fā)生時(shí),就會(huì)執(zhí)行這段代碼瞬痘。Objective-C中四種途徑可以實(shí)現(xiàn)回調(diào):

  1. 目標(biāo)-動(dòng)作對(duì)(target-action):在程序開始等待前蒿秦,要求“當(dāng)事件發(fā)生時(shí),向指定的對(duì)象發(fā)生某個(gè)特定的消息”。在這里接收消息的對(duì)象是目標(biāo)(target)西设,消息的選擇器(selector)是動(dòng)作(action)瓣铣。
  2. 輔助對(duì)象(helper object):在程序開始等待前,要求“當(dāng)事件發(fā)生時(shí)贷揽,向遵守相應(yīng)協(xié)議的輔助對(duì)象發(fā)送消息”棠笑。委托對(duì)象(delegate)和數(shù)據(jù)源(data source)是常見的輔助對(duì)象。
  3. 通知(notification):即是通知中心(notification center)的對(duì)象擒滑。在程序開始等待前腐晾,可以告知通知中心“某個(gè)對(duì)象正在等待某些特定的通知。當(dāng)其中的某個(gè)通知出現(xiàn)時(shí)丐一,向指定的對(duì)象發(fā)送特定的消息”藻糖。當(dāng)事件發(fā)生時(shí),相關(guān)的對(duì)象會(huì)向通知中心發(fā)布通知库车,然后再由通知中心將通知轉(zhuǎn)發(fā)給正在等待該通知的對(duì)象巨柒。
  4. Block對(duì)象(Blocks):Block是一段可執(zhí)行的代碼。在程序開始等待前柠衍,聲明一個(gè)Block對(duì)象洋满,當(dāng)事件發(fā)生時(shí),執(zhí)行這段Block對(duì)象珍坊。

事例代碼:
BNRLogger.h

#import <Foundation/Foundation.h>

@interface BNRLogger : NSObject <NSURLConnectionDelegate,NSURLConnectionDataDelegate>
{
    NSMutableData *_incomingData;
}
@property (nonatomic) NSDate *lastTime;

-(NSString *) lastTimeString;
-(void)updateLastTime:(NSTimer *)t;

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
-(void)connectionDidFinishLoading:(NSURLConnection *)connection;
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;

-(void)zoneChange:(NSNotification *)note;

@end

BNRLogger.m

#import "BNRLogger.h"

@implementation BNRLogger

-(NSString *)lastTimeString
{
    static NSDateFormatter *dateFormatter = nil;
    if (!dateFormatter) {
        dateFormatter = [[NSDateFormatter alloc]init];
        [dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
        [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
        NSLog(@"created dateFormatter");
    }
    return [dateFormatter stringFromDate:self.lastTime];
}

-(void) updateLastTime:(NSTimer *)t
{
    NSDate *now = [NSDate date];
    [self setLastTime:now];
    NSLog(@"Just set time to %@", self.lastTimeString);
}

//三個(gè)協(xié)議
//收到一定字節(jié)數(shù)的數(shù)據(jù)后會(huì)被調(diào)用
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    NSLog(@"received %lu bytes",[data length]);
    
    if (!_incomingData) {
        _incomingData = [[NSMutableData alloc]init];
    }
    
    [_incomingData appendData:data];
}

//最后一部分?jǐn)?shù)據(jù)處理完畢后會(huì)被調(diào)用
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"Got it all");
    NSString *string = [[NSString alloc]initWithData:_incomingData encoding:NSUTF8StringEncoding];
    
    _incomingData = nil;
    NSLog(@"String has %lu characters",[string length]);
    
    //如果需要輸出獲取的全部數(shù)據(jù)牺勾,則可以取消下面這行代碼
    //NSLog(@"The whole string is %@",string);
}

//獲取數(shù)據(jù)失敗時(shí)會(huì)被調(diào)用
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"connection failed: %@",[error localizedDescription]);
    _incomingData = nil;
}

//通知
-(void)zoneChange:(NSNotification *)note
{
    NSLog(@"The system time zone has changed!");
}
@end

main.m

#import <Foundation/Foundation.h>

#import "BNRLogger.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
//        NSLog(@"Hello, World!");
        
        BNRLogger *logger = [[BNRLogger alloc]init];
        
        //將BNRLogger實(shí)例注冊(cè)為觀察者
        [[NSNotificationCenter defaultCenter] addObserver:logger selector:@selector(zoneChange) name:NSSystemTimeZoneDidChangeNotification object:nil];
        
        
        
        NSURL *url = [NSURL URLWithString:@"http://www.gutenberg.org/cacahe/epub/205/pg205.txt"];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        __unused NSURLConnection *fetchConn = [[NSURLConnection alloc]initWithRequest:request delegate:logger startImmediately:YES];
        
        //未使用變量阵漏,用于消除編譯器警告
        __unused NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:logger selector:@selector(updateLastTime:) userInfo:nil repeats:YES];
        
        //運(yùn)行循環(huán)
        [[NSRunLoop currentRunLoop] run];
    }
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末驻民,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子履怯,更是在濱河造成了極大的恐慌回还,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叹洲,死亡現(xiàn)場(chǎng)離奇詭異柠硕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)运提,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門蝗柔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人民泵,你說(shuō)我怎么就攤上這事诫咱。” “怎么了洪灯?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵坎缭,是天一觀的道長(zhǎng)竟痰。 經(jīng)常有香客問我,道長(zhǎng)掏呼,這世上最難降的妖魔是什么坏快? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮憎夷,結(jié)果婚禮上莽鸿,老公的妹妹穿的比我還像新娘。我一直安慰自己拾给,他們只是感情好祥得,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蒋得,像睡著了一般级及。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上额衙,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天饮焦,我揣著相機(jī)與錄音,去河邊找鬼窍侧。 笑死县踢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的伟件。 我是一名探鬼主播硼啤,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼斧账!你這毒婦竟也來(lái)了谴返?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤其骄,失蹤者是張志新(化名)和其女友劉穎亏镰,沒想到半個(gè)月后扯旷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拯爽,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年钧忽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了毯炮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡耸黑,死狀恐怖桃煎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情大刊,我是刑警寧澤为迈,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響葫辐,放射性物質(zhì)發(fā)生泄漏搜锰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一耿战、第九天 我趴在偏房一處隱蔽的房頂上張望蛋叼。 院中可真熱鬧,春花似錦剂陡、人聲如沸狈涮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)歌馍。三九已至,卻和暖如春纤泵,著一層夾襖步出監(jiān)牢的瞬間骆姐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工捏题, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留玻褪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓公荧,卻偏偏與公主長(zhǎng)得像带射,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子循狰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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

  • 本文主要參考:《Object-C 編程 Big Nerd Ranch Guide》一書第24章 本文適讀對(duì)象: 想...
    AntonyWong閱讀 27,331評(píng)論 16 111
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理窟社,服務(wù)發(fā)現(xiàn),斷路器绪钥,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,124評(píng)論 29 470
  • 相信大家都知道委托和事件灿里,沒錯(cuò),委托和事件是用來(lái)傳遞和保存函數(shù)用的程腹,那么 回調(diào) 呢匣吊,近段時(shí)間的學(xué)習(xí)中經(jīng)常碰到 回調(diào)...
    道阻且長(zhǎng)_行則將至閱讀 1,391評(píng)論 0 1
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 10,868評(píng)論 6 13