極客班 iOS 設計模式(二)

重點在通知模式流程圖,大致了解幾種通知模式的用途的區別。都是理論的東西,還是希望實際寫代碼時聯系理論,仔細考慮選擇。

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

6. 委托模式

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

以 Master-Detail Application 模板詳細介紹了委托模式。孔老師喜歡直接看類的定義。

UITableView delegation
UITableView delegation

Jump to Definition
Jump to Definition

UITableViewDataSource
UITableViewDataSource

7. 觀察者和消息通知

MVC
MVC

Observer pattern
Observer pattern
  • 定義對象間一種?對多的依賴關系,使得每當一個對象改變狀態,則所有依賴于他的對象都會得到通知并被自動更新。
  • Subject被觀察者:定義被觀察者必須實現的職責,它必須能夠動態的增加、取消 觀察者。它一般是抽象類或者是實現類,僅僅完成作為被觀察者必須實現的職責
    :管理觀察者并通知觀察者
  • Observer觀察者:觀察者接收到消息后,即進行update(更新方法)操作,對接收到的信息進行處理。
  • 具體的被觀察者:定義被觀察者自己的業務邏輯,同時定義對哪些事件進行通知。
  • 具體的觀察者:每個觀察者在接收到消息后的處理反應是不同的,各個觀察者有自己的處理邏輯。

通知

Notification pattern
Notification pattern

應用場景:

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

代碼實現參看李久寧的文章:iOS 設計模式之四:觀察者模式

Key-Value-Coding and Key-Value-Observing

可在 Xcode 中 Open Quickly(??O),查看NSKeyValueCoding.h協議的內容。

典型的例子 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

  • 消息傳遞機制

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


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

9. 歸檔和解檔

NSCoding

是一個簡單的協議,有兩個方法: -initWithCoder: 和 encodeWithCoder:。遵循NSCoding協議的類可以被序列化和反序列化,這樣可以歸檔到磁盤上或分發到網絡上。

@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設置它的屬性集合。

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

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

NSUserDefaults

每個應用程序都有自己的user preferences,它可以存儲和檢索遵循NSCoding協議的對象或者是C類型數據。

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

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

延伸閱讀:

10. 復制模式

  • 創建一個對象的新副本
  • 復制一個復雜對象時,保護一個一樣的對象,還是包含原來對象的副本
  • 用戶界面上的復制/粘貼 有些對象封裝了獨一無?的資源,復制沒有意義
  • 淺復制和深復制。顧名思義,淺復制,并不拷?對象本?,僅僅是拷貝指向對象的指針;深復制是直接拷貝整個對象內存到另?塊內存中

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

參看 MicroCai 的文章:iOS 集合的深復制與淺復制

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,197評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,415評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,104評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,884評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,647評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,130評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,208評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,366評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,887評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,737評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,939評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,478評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,174評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,586評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,827評論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,608評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,914評論 2 372

推薦閱讀更多精彩內容

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