About protocol & delegate

Paste_Image.png

引入幾個概念

  • 協(xié)議方

協(xié)議方最好另起一個.h 针贬,協(xié)議方內(nèi)的optional / required,我稱它為——協(xié)議函數(shù)——,這里只有聲明協(xié)議函數(shù)

  • 委托方

——委托函數(shù)——著角,就是上面的 doWork , ——委托函數(shù)—— 中讓代理去實現(xiàn)協(xié)議方的——協(xié)議函數(shù)—— : doSomeRequiredWork/doSomeOptionalWork

  • 代理方

新建一個委托方類事富,實現(xiàn) ——協(xié)議函數(shù)——

下面是說明

  • 協(xié)議方

協(xié)議方?jīng)]什么好說的技俐,格式正確即可

  • 委托方

** 委托方不實現(xiàn)協(xié)議,代理方是委托方的屬性變量统台,通過后續(xù)賦值來實例化之 **

  • 協(xié)議要么單獨(dú)寫一個.h雕擂,要么寫在委托方,最后代理方導(dǎo)入委托方的.h贱勃。避免多個代理的時候井赌,委托方要導(dǎo)入很多次(看個人習(xí)慣谤逼,我覺得這樣寫比較好)
  • 下面是完整的委托方代碼 注意第四行

代理方 是 委托方的屬性變量,委托方必須遵循協(xié)議方的內(nèi)容3鹚搿A鞑俊!

/*****************************************************************/
// ———————————————————— Manager.h 類 ————————————————————
@interface Manager:NSObject
//代理方 是 委托方的屬性變量纹坐,委托方必須遵循協(xié)議方的內(nèi)容V健!耘子!
@property (strong,nonatomic) id<JobContent> delegate; 
-(void)doWork;
@end
// ———————————————————— Manager.m 類 ————————————————————
#import Manager.h
@implementation Manager
-(void)doWork // 委托函數(shù)宾茂,有些情況是需要傳參
{
    [self.delegate doSomeRequiredWork];// 1. 代理方必須實現(xiàn)的內(nèi)容!
    // 2. 判斷某個代理方是否存在可選實現(xiàn)的內(nèi)容 拴还!
    if ([self.delegate respondsToSelector:@selector(doSomeOptionalWork)])
    {
        [self.delegate doSomeOptionalWork];//存在跨晴,執(zhí)行worker可選的內(nèi)容
    }
    [self myWork]; // 3. 委托方自己要實現(xiàn)的內(nèi)容!
}
-(void)myWork
{
    NSLog(@"do manager's work");
}
@end
  • 代理方

    • 代理方可以存在多個片林,只要實現(xiàn)委托方交給的協(xié)議就可以了端盆!下面是舉例兩個代理方的代碼. 包含兩個類
  • 其一 Worker_One
/*****************************************************************/
// Worker_One.h
@interface Worker_One:NSObject<JobContent>
-(void)doSomeRequiredWork;//遵循協(xié)議必須實現(xiàn)的函數(shù)
@end
// Worker_One.m
#import Worker_One.h
@implementation Worker_One
-(void)doSomeRequiredWork
{
    NSLog(@"do Worker_One's Job");
}
@end
  • 其二
/*****************************************************************/
// Worker_Two.h
@interface Worker_Two:NSObject<JobContent>
-(void)doSomeRequiredWork;//遵循協(xié)議必須實現(xiàn)的函數(shù)
-(void)doSomeOptionalWork;//woker two 有實現(xiàn)可選操作
@end
// Worker_Two.m
#import Worker_Two.h
@implementation Worker_Two
-(void)doSomeRequiredWork
{
    NSLog(@"do Worker_Two's Job");
}
-(void)doSomeOptionalWork
{
    NSLog(@"My optional work,I'm worker two");
}
@end
  • 最后的綜合調(diào)用
-(void)ViewDidLoad
{
    Manager* manager = [Manager new];
    Worker_One *w_1  = [Worker_One new];
    Worker_Two *w_2  = [Worker_Two new];
    manager.delegate = w_1;
    [manager doWork];
    manager.delegate = w_2;
    [manager doWork];
}

如果情況為 自己 委托 自己作為代理,實現(xiàn)協(xié)議函數(shù)

則無所謂在@property中設(shè)定 id<協(xié)議名> 代理方

這時候费封, 委托函數(shù)傳入的值就是self, 協(xié)議函數(shù)也在同一 .m中焕妙,

如我們的sdk里的例子

1. `- (void)initializeAudioDriver`
2. `{`
3. ` // 音頻連接參數(shù)`
4. ` id\<NLDeviceConnParams\> params = [[NLAudioPortV100ConnParams alloc] init];`
5. ` // 請求連接并獲取ME11終端設(shè)備`
6. ` NSError \*err = nil; // 驅(qū)動連接設(shè)備錯誤指針`
7. `***// ———————— 委托函數(shù) ——————————***`
8. ` self.device = [self.driver connectWithConnParams:params`
9. **` closedListener:self // 代理方:id\<某協(xié)議\>,此處委托自己`**
10. **` launchListener:self // `****`代理方:id\<某協(xié)議\>弓摘,此處委托自己`**
11. ` error:&err];`
12. ` if (err || !self.device) { // 獲取失敗`
13. ` [self performSelectorOnMainThread:@selector(onDeviceConnectFailed:) withObject:[NSString stringWithFormat:@"%@", err] waitUntilDone:NO];`
14. ` return ;`
15. ` }`
16. ` NSLog(@"Audio device instance %@", self.device);`
17. ` [self performSelectorOnMainThread:@selector(onDevicecConnectSuccess) withObject:nil waitUntilDone:NO];`
18. `}`

下面是協(xié)議函數(shù) onEvent

    1. `- (void)onEvent:(id \<NLDeviceEvent\>)event`
    2. `{`
    3. ` NSLog(@"onEvent : %@", event);`
    4. ` // TODO判別事件類型并做相應(yīng)處理`
    5. ` if ([event isKindOfClass:[NLConnectionCloseEvent class]]) {`
    6. ` [(UINavigationController\*)self.window.rootViewController topViewController].title = @"設(shè)備斷開連接";`
    7. ` if ([self.viewController respondsToSelector:@selector(addText:)]) {`
    8. ` [self.viewController performSelector:@selector(addText:) withObject:@"設(shè)備斷開連接!!!"];`
    9. ` }`
    10. ` `
    11. ` } else if ([event isKindOfClass:[NLDeviceLaunchEvent class]]) {`
    12. ` NLDeviceLaunchEvent \*launchEvent = (NLDeviceLaunchEvent\*)event;`
    13. ` if ([launchEvent isSuccess]) {`
    14. ` // 0xA5 + Len(2B) + 0x3A + 固件版本號(1B) + ksn + CRC(1B) + 0x5A`
    15. ` NSData \*data = [launchEvent userInfo][NLDeviceLaunchDataInfo];`
    16. ` if (data.length \> 7) {`
    17. ` NSLog(@"KSN : %@", [NLISOUtils hexStringWithData:[data subdataWithRange:NSMakeRange(5, data.length - 7)]]);`
    18. ` }`
    19. ` }`
    20. ` } else if ([event isKindOfClass:[NLDeviceMenuEvent class]]) {`
    21. ` NLDeviceMenuEvent \*menuEvent = (NLDeviceMenuEvent\*)event;`
    22. ` NSString \*text = nil;`
    23. ` if ([menuEvent isSuccess]) {`
    24. ` text = [NSString stringWithFormat:@"menu keycode:%d ,ecode: %@", [menuEvent keyCode], [menuEvent eCode]];`
    25. ` } else {`
    26. ` text = [NSString stringWithFormat:@"menu event failed!error: %@", [menuEvent error]];`
    27. ` }`
    28. ` [self.viewController performSelector:@selector(addText:) withObject:text];`
    29. ` }`
    30. `}`
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末焚鹊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子韧献,更是在濱河造成了極大的恐慌末患,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锤窑,死亡現(xiàn)場離奇詭異璧针,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)渊啰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門探橱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绘证,你說我怎么就攤上這事隧膏。” “怎么了嚷那?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵胞枕,是天一觀的道長。 經(jīng)常有香客問我车酣,道長曲稼,這世上最難降的妖魔是什么索绪? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮贫悄,結(jié)果婚禮上瑞驱,老公的妹妹穿的比我還像新娘。我一直安慰自己窄坦,他們只是感情好唤反,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鸭津,像睡著了一般彤侍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逆趋,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天盏阶,我揣著相機(jī)與錄音,去河邊找鬼闻书。 笑死名斟,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的魄眉。 我是一名探鬼主播砰盐,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼坑律!你這毒婦竟也來了岩梳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤晃择,失蹤者是張志新(化名)和其女友劉穎冀值,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體藕各,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡池摧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了激况。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡膘魄,死狀恐怖乌逐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情创葡,我是刑警寧澤浙踢,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站灿渴,受9級特大地震影響洛波,放射性物質(zhì)發(fā)生泄漏胰舆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一蹬挤、第九天 我趴在偏房一處隱蔽的房頂上張望缚窿。 院中可真熱鬧,春花似錦焰扳、人聲如沸倦零。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扫茅。三九已至,卻和暖如春育瓜,著一層夾襖步出監(jiān)牢的瞬間葫隙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工躏仇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留停蕉,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓钙态,卻偏偏與公主長得像慧起,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子册倒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

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

  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,135評論 30 470
  • 1.項目經(jīng)驗 2.基礎(chǔ)問題 3.指南認(rèn)識 4.解決思路 ios開發(fā)三大塊: 1.Oc基礎(chǔ) 2.CocoaTouch...
    陽光的大男孩兒閱讀 4,971評論 0 13
  • 1.OC里用到集合類是什么蚓挤? 基本類型為:NSArray,NSSet以及NSDictionary 可變類型為:NS...
    輕皺眉頭淺憂思閱讀 1,368評論 0 3
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理驻子,服務(wù)發(fā)現(xiàn)灿意,斷路器,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • 哈哈哈哈哈哈哈
    很酷很辣椒閱讀 169評論 0 0