極客班 iOS 設(shè)計模式(二)

重點(diǎn)在通知模式流程圖,大致了解幾種通知模式的用途的區(qū)別髓废。都是理論的東西巷懈,還是希望實(shí)際寫代碼時聯(lián)系理論,仔細(xì)考慮選擇慌洪。

課件下載:
https://github.com/gewill/GeekBand-iOS-Demo/tree/master/Design%20Patterns

6. 委托模式

  • 復(fù)雜的模型,scrollView,tableView,collectionView
  • 單?一個類無法表現(xiàn)復(fù)雜的設(shè)計
  • 設(shè)計拆分
  • 方便重?
  • delegate 獨(dú)立對象
  • 清晰定義功能,變化行為/自定義界?面
  • 松散耦合,容易擴(kuò)展

以 Master-Detail Application 模板詳細(xì)介紹了委托模式顶燕。孔老師喜歡直接看類的定義冈爹。

UITableView delegation
UITableView delegation

Jump to Definition
Jump to Definition

UITableViewDataSource
UITableViewDataSource

7. 觀察者和消息通知

MVC
MVC

Observer pattern
Observer pattern
  • 定義對象間一種?對多的依賴關(guān)系,使得每當(dāng)一個對象改變狀態(tài),則所有依賴于他的對象都會得到通知并被自動更新涌攻。
  • Subject被觀察者:定義被觀察者必須實(shí)現(xiàn)的職責(zé),它必須能夠動態(tài)的增加、取消 觀察者频伤。它一般是抽象類或者是實(shí)現(xiàn)類,僅僅完成作為被觀察者必須實(shí)現(xiàn)的職責(zé)
    :管理觀察者并通知觀察者
  • Observer觀察者:觀察者接收到消息后,即進(jìn)行update(更新方法)操作,對接收到的信息進(jìn)行處理恳谎。
  • 具體的被觀察者:定義被觀察者自己的業(yè)務(wù)邏輯,同時定義對哪些事件進(jìn)行通知。
  • 具體的觀察者:每個觀察者在接收到消息后的處理反應(yīng)是不同的,各個觀察者有自己的處理邏輯憋肖。

通知

Notification pattern
Notification pattern

應(yīng)用場景:

  • 窗口變化通知
  • 系統(tǒng)鍵盤的出現(xiàn)和消失/位置?小變化
  • UITextField 字符變化通知(可以用來限制輸入長度)
  • MPMoviePlayerController 播放器的?為變化(開始結(jié)束等事件)
  • 自定義Class使用

代碼實(shí)現(xiàn)參看李久寧的文章:iOS 設(shè)計模式之四:觀察者模式

Key-Value-Coding and Key-Value-Observing

可在 Xcode 中 Open Quickly(??O)因痛,查看NSKeyValueCoding.h協(xié)議的內(nèi)容婚苹。

典型的例子 NSOperation and NSOperationQueue


/*  NSOperation.h
    Copyright (c) 2006-2014, Apple Inc. All rights reserved.
*/

@interface NSOperation : NSObject {
@private
    id _private;
    int32_t _private1;
#if __LP64__
    int32_t _private1b;
#endif
}

- (void)start;
- (void)main;

@property (readonly, getter=isCancelled) BOOL cancelled;
- (void)cancel;

@property (readonly, getter=isExecuting) BOOL executing;
@property (readonly, getter=isFinished) BOOL finished;
@property (readonly, getter=isConcurrent) BOOL concurrent; // To be deprecated; use and override 'asynchronous' below
@property (readonly, getter=isAsynchronous) BOOL asynchronous NS_AVAILABLE(10_8, 7_0);
@property (readonly, getter=isReady) BOOL ready;
NSOperationQueue

延伸閱讀:

  • Apple Key-Value Coding Programming Guide

    This document describes the NSKeyValueCoding informal protocol, which defines a mechanism allowing applications to access the properties of an object indirectly by name (or key), rather than directly through invocation of an accessor method or as instance variables.

    Dot Syntax and Key-Value Coding: Objective-C’s dot syntax and key-value coding are orthogonal technologies. You can use key-value coding whether or not you use the dot syntax, and you can use the dot syntax whether or not you use KVC. Both, though, make use of a “dot syntax.” In the case of key-value coding, the syntax is used to delimit elements in a key path. Remember that when you access a property using the dot syntax, you invoke the receiver’s standard accessor methods.

  • KVC 和 KVO

  • 消息傳遞機(jī)制

    我們會常常提及“接收者”和“發(fā)送者”。它們在消息傳遞中的意思可以通過以下的例子解釋:一個 table view 是發(fā)送者婚肆,它的 delegate 就是接收者租副。Core Data managed object context 是它所發(fā)出的 notification 的發(fā)送者,獲取 notification 的就是接收者较性。一個滑塊 (slider) 是 action 消息的發(fā)送者用僧,而實(shí)現(xiàn)這個 action (方法)的是它的接收者。任何修改一個支持 KVO 的對象的對象是發(fā)送者赞咙,這個 KVO 對象的觀察者就是接收者责循。明白精髓了嗎?
    基于不同消息傳遞機(jī)制的特點(diǎn)的流程圖


    communication-patterns-flow-chart
    communication-patterns-flow-chart

9. 歸檔和解檔

NSCoding

是一個簡單的協(xié)議攀操,有兩個方法: -initWithCoder: 和 encodeWithCoder:院仿。遵循NSCoding協(xié)議的類可以被序列化和反序列化,這樣可以歸檔到磁盤上或分發(fā)到網(wǎng)絡(luò)上速和。

@interface Book : NSObject <NSCoding>
@property NSString *title;
@property NSString *author;
@property NSUInteger pageCount;
@property NSSet *categories;
@property (getter = isAvailable) BOOL available;
@end

@implementation Book

#pragma mark - NSCoding

- (id)initWithCoder:(NSCoder *)decoder {
    self = [super init];
    if (!self) {
        return nil;
    }

    self.title = [decoder decodeObjectForKey:@"title"];
    self.author = [decoder decodeObjectForKey:@"author"];
    self.pageCount = [decoder decodeIntegerForKey:@"pageCount"];
    self.categories = [decoder decodeObjectForKey:@"categories"];
    self.available = [decoder decodeBoolForKey:@"available"];

    return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeObject:self.title forKey:@"title"];
    [encoder encodeObject:self.author forKey:@"author"];
    [encoder encodeInteger:self.pageCount forKey:@"pageCount"];
    [encoder encodeObject:self.categories forKey:@"categories"];
    [encoder encodeBool:[self isAvailable] forKey:@"available"];
}

@end

NSKeyedArchiver 和 NSKeyedUnarchiver

提供了很方便的API把對象讀取/寫入磁盤歹垫。一個基于NSCoding的table view controller可以通過file manager設(shè)置它的屬性集合。

[NSKeyedArchiver archiveRootObject:books toFile:@"/path/to/archive"];

[NSKeyedUnarchiver unarchiveObjectWithFile:@"/path/to/archive"];

NSUserDefaults

每個應(yīng)用程序都有自己的user preferences颠放,它可以存儲和檢索遵循NSCoding協(xié)議的對象或者是C類型數(shù)據(jù)排惨。

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:books];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"books"];

NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"books"];
NSArray *books = [NSKeyedUnarchiver unarchiveObjectWithData:data];

延伸閱讀:

10. 復(fù)制模式

  • 創(chuàng)建一個對象的新副本
  • 復(fù)制一個復(fù)雜對象時,保護(hù)一個一樣的對象,還是包含原來對象的副本
  • 用戶界面上的復(fù)制/粘貼 有些對象封裝了獨(dú)一無?的資源,復(fù)制沒有意義
  • 淺復(fù)制和深復(fù)制。顧名思義,淺復(fù)制,并不拷?對象本?,僅僅是拷貝指向?qū)ο蟮闹羔?深復(fù)制是直接拷貝整個對象內(nèi)存到另?塊內(nèi)存中

- initWithDictionary:copyItems 就是個典型例子碰凶,可深可淺暮芭。

參看 MicroCai 的文章:iOS 集合的深復(fù)制與淺復(fù)制

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市欲低,隨后出現(xiàn)的幾起案子辕宏,更是在濱河造成了極大的恐慌,老刑警劉巖砾莱,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瑞筐,死亡現(xiàn)場離奇詭異,居然都是意外死亡腊瑟,警方通過查閱死者的電腦和手機(jī)面哼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扫步,“玉大人,你說我怎么就攤上這事匈子『犹ィ” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵虎敦,是天一觀的道長游岳。 經(jīng)常有香客問我政敢,道長,這世上最難降的妖魔是什么胚迫? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任喷户,我火速辦了婚禮,結(jié)果婚禮上访锻,老公的妹妹穿的比我還像新娘褪尝。我一直安慰自己,他們只是感情好期犬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布河哑。 她就那樣靜靜地躺著,像睡著了一般龟虎。 火紅的嫁衣襯著肌膚如雪璃谨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天鲤妥,我揣著相機(jī)與錄音佳吞,去河邊找鬼。 笑死棉安,一個胖子當(dāng)著我的面吹牛底扳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播垂券,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼花盐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了菇爪?” 一聲冷哼從身側(cè)響起算芯,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凳宙,沒想到半個月后熙揍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡氏涩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年届囚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片是尖。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡意系,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出饺汹,到底是詐尸還是另有隱情蛔添,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站迎瞧,受9級特大地震影響夸溶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凶硅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一缝裁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧足绅,春花似錦捷绑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至允懂,卻和暖如春厕怜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蕾总。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工粥航, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人生百。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓递雀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蚀浆。 傳聞我的和親對象是個殘疾皇子缀程,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

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

  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,140評論 30 470
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)市俊,斷路器杨凑,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • Swift版本點(diǎn)擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 25,374評論 7 249
  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品绅你,去做同樣的事情伺帘,實(shí)現(xiàn)同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 7,758評論 2 17
  • 1.OC里用到集合類是什么忌锯? 基本類型為:NSArray伪嫁,NSSet以及NSDictionary 可變類型為:NS...
    輕皺眉頭淺憂思閱讀 1,374評論 0 3