Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Upcoming SlideShare
Interfacing BLE with android based device
Next
Download to read offline and view in fullscreen.

32

Share

Download to read offline

in in der 響應式編程

Download to read offline

今年 Apple WWDC 2014 發表新的程式語言 Swift,造成全世界熱烈討論,在這個 典範轉移 (Paradigm Shift) 的過渡時期,我們要做好哪些準備呢?

當全世界的程式語言(包含 Swift、Java),都往 Functional Programming 發展,我們要先來了解一下,什麼是 Functional Programming,可當作是迎接 Swift 新語言挑戰之前的先修班。

什麼是 ReactiveCocoa?
ReactiveCocoa 是由 GitHub 發表,來自于兩位大師 Josh Abernathy & Justin Spahr-Summers 所創造而來,主要將 Functional Reactive Programming 概念注入 Objective-C。


Functional Reactive Programming
一般程式週期為 Input 到 Output 的處理轉換,Input 可以是來自于 資料、Web Service、鍵盤事件...等,Output 可以是 使用者UI 或 存入檔案,ReactiveCocoa 提供開發者另一個資料輸入輸出的新思維,將複雜的程式邏輯,用簡潔的方式解決。

Mattt大神說「ReactiveCocoa 是 Objective-C 的新紀元」
Justin DeWind「ReactiveCocoa 將是 Cocoa 的未來」

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

in in der 響應式編程

  1. 1. in in der 響應式編程 張景隆 ! iOS Dev Club 蘋果貓咖啡 MOPCON 2014
  2. 2. ReactiveCocoa
  3. 3. Questions •聽過 RAC •很熟悉 RAC •已經⽤用在專案上
  4. 4. What is ReactiveCocoa ReactiveCocoa is an open source library that brings Functional Reactive Programming paradigm to Objective-C. It was created by Josh Abernathy & Justin Spahr-Summers in the development of GitHub for Mac.
  5. 5. What is Stream?
  6. 6. ⼤大家覺得⽤用起來像是
  7. 7. 但實際⽤用起來
  8. 8. 看了 ReactiveCocoa 的 ! README
  9. 9. Agenda • 介紹 FRP • 事件與⾮非同步等問題 • 介紹 ReactiveCocoa • RAC 基礎 • RAC Example • iOS Dev Club 社群介紹
  10. 10. Appletone • Perl • Linux • Java • Ruby • Objective-C • Swift
  11. 11. biichat BTWCar CWMoney
  12. 12. The Information Processing Cycle
  13. 13. Imperative Programming int x, y, z; x = 1; y = 1; z = x + y; // 1+1 y = 2; printf("%d", z); // z=2
  14. 14. Reactive Programming int x, y, z; x = 1; y = 1; z = x + y; // 1+1 y = 2; printf("%d", z); // z=3
  15. 15. Functional Programming Swift: map(1...3){ $0 * 5 } ObjC: NSMutableArray *arr = [NSMutableArray new]; for(int i=1; i<=3; i++) { [arr addObject:@(i * 5)]; }
  16. 16. Functional Reactive Programming 即 FP + RP 綜合兩種特性 ! 賦予 RP 擁有許多 FP 的運算函⽰示
  17. 17. Problems • Target-Action • Delegate • Block • Notifications • KVO ! • ⽅方式太多 • 缺乏⼀一致性 • 商業邏輯分散 • 難以整合各個事件
  18. 18. RAC dealing with One of the major advantages of RAC is that it provides a single, unified approach to dealing with ! 1. asynchronous behaviors, 2. including delegate methods, 3. callback blocks, 4. target-action mechanisms, 5. notifications, 6. and KVO.
  19. 19. Why ReactiveCocoa?
  20. 20. Mattt Thompson : “ The brave new era for Objective-C “ Justin DeWind : “ The Future of Cocoa Programming “ http://nshipster.com/reactivecocoa/ http://spin.atomicobject.com/2013/04/28/reactivecocoa/
  21. 21. Terms • RACSignal vs. RACSequence • Cold or Hot Signals
  22. 22. RACSignal vs. RACSequence pull-­‐driven push-­‐driven
  23. 23. Terms • RACSignal vs. RACSequence • Cold or Hot Signals
  24. 24. Cold or Hot Signals • Hot Signals • 按鈕事件 • 事件即時通知 ! • Cold Signals • 網路事件 • 不會⾺馬上有結果
  25. 25. Macros • RACObserve() • 建⽴立 RACSignal • 數值變動發動 ! ! • RAC() • 放在 assignment operator 的左邊 • 綁定 RACSignal 給的數值
  26. 26. RACObserve new value ! ! [RACObserve(self, username) subscribeNext:^(NSString *newName) { self.consoleLabel.text = newName; }]; RACSignal Subscriber
  27. 27. RAC RACSignal binding Value RAC(self.consoleLabel, text) = RACObserve(self, username);
  28. 28. 廣泛的使⽤用 KVO 為什麼不⽤用 KVO 就好?
  29. 29. 信號可被串接 KVO 不好⽤用 蘋果的⽂文件寫的很讚 但是API設計的很爛
  30. 30. Example I ! • rac_textSignal • map • avoiding retain cycles
  31. 31. Example I [self.textField.rac_textSignal subscribeNext:^(id x) { self.console.text = x; }]; OR RAC(self.console, text) = self.textField.rac_textSignal;
  32. 32. Example I #import <RACEXTScope.h> @weakify(self); [[self.textField.rac_textSignal map:^id(id value) { return [value uppercaseString]; }] subscribeNext:^(id x) { @strongify(self); self.console.text = x; }];
  33. 33. Example II Login Demo
  34. 34. Example II RACSignal *nameSignal = self.nameTextField.rac_textSignal; RACSignal *passSignal = self.passTextField.rac_textSignal; RAC(self.loginButton, enabled) = [RACSignal combineLatest:@[nameSignal, passSignal] reduce:^id(NSString *name, NSString *pass){ return @( ![name isEqualToString:@""] && ![pass isEqualToString:@""] ); }];
  35. 35. Example III NSUserDefault
  36. 36. Example III ! RACSignal *tokenSignal = [[NSUserDefaults standardUserDefaults] rac_channelTerminalForKey:@"token"]; [[tokenSignal filter:^BOOL(NSString *token) { return [token chuzzle]?YES:NO; }] subscribeNext:^(NSString *token) { [self loadData]; }];
  37. 37. Example IV ! AFNetworkReachabilityManager AFNetworking
  38. 38. AFNetworkReachabilityManager *reachabilityManager = [AFNetworkReachabilityManager sharedManager]; RACSignal *isReachable = [RACObserve( reachabilityManager, networkReachabilityStatus) map:^(NSNumber *networkReachabilityStatus) { switch (networkReachabilityStatus.intValue) { case AFNetworkReachabilityStatusReachableViaWWAN: case AFNetworkReachabilityStatusReachableViaWiFi: return @YES; } return @NO; }];
  39. 39. [[AFHTTPRequestOperationManager alloc] init]; ! NSString *URLString = @"http://ip.jsontest.com"; AFHTTPRequestOperationManager *manager = RACSignal *myIPSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { [manager GET:URLString parameters:nil success:^(AFHTTPRequestOperation *op, id response) { ! } failure:^(AFHTTPRequestOperation *op, NSError *e) { ! } ]; return nil; }]; [subscriber sendNext:response]; [subscriber sendCompleted]; [subscriber sendError:e]; [myIPSignal subscribeNext:^(id response) { // NSLog(@"My IP => %@", response[@"ip"]); }];
  40. 40. Example V • 檢查 網路狀態 以及 雲端伺服器 是否正常 • 使⽤用者是否啟⽤用同步功能 • 有待同步資料 • 需綁定 FB Account • 可設定 WIFI 或 3G 底下同步
  41. 41. RACSignal *networkSignal = RACObserve(self, isNetworkReachable); RACSignal *cloudSignal = RACObserve(self, isUsedCloud); RACSignal *facebookSignal = RACObserve(self, isFacebookBinding); RACSignal *wifiOnlySignal = RACObserve(self, isWifiSyncOnly); ! NSArray *signals = @[networkSignal, cloudSignal, facebookSignal, wifiOnlySignal]; RACSignal *preparedSignal = [RACSignal combineLatest:signals reduce:^id (id network, id cloud, id facebook, id wifi){ return @([network boolValue] && [cloud boolValue] && [facebook boolValue] && [wifi boolValue]); }]; RACSignal *queueSignal = RACObserve(self, uploadQueue); [[[RACSignal combineLatest:@[preparedSignal, queueSignal]] filter:^BOOL(RACTuple *tuple) { return [[tuple first] boolValue]; }] subscribeNext:^(RACTuple *tuple) { // id task = [tuple second]; // do something ... }];
  42. 42. RACSignal *queueSignal = RACObserve(self, uploadQueue); [[[RACSignal combineLatest:@[preparedSignal, queueSignal]] filter:^BOOL(RACTuple *tuple) { return [[tuple first] boolValue]; }] subscribeNext:^(RACTuple *tuple) { deliverOn:[RACScheduler scheduler]] // id task = [tuple second]; // do something ... }]; [ Asynchronous Operation
  43. 43. RACSignal+Operations.h
  44. 44. Recap • RACSequence & RACSignal 的差別 • 熱信號 與 冷信號 • 實⽤用的 Macros: RACObserve() & RAC() • 信號 的 建⽴立、訂閱、合併、轉換、過濾 • 如何建⽴立⾮非同步的網路信號
  45. 45. iOS Dev Club
  46. 46. ! iOS Dev Club 開發者聚會 iOS Dev Club 成⽴立於 2011 年 5 ⽉月。 我們是以 Facebook 的社團(groups)成⽴立,主要是為了在中部附近的 iOS App 設計 開發同好,可以經常性碰⾯面互相學習的聚會,我們的地點都選擇在咖啡館,固 定在每個⽉月最後⼀一週的星期六上午,每次都會安排主題分享研習。 ! 第⼀一年,我們在彰化的顏⽒氏牧場II舉辦。 第⼆二年,我們在台中的默契咖啡舉辦。 第三年,我們挑戰環島~ ! 因為每個⽉月中旬發出聚會訊息時,最常⾒見的歎息就是:為什麼不是在XXX? (XXX=請⾃自⾏行帶⼊入離⾃自⼰己居住熟悉或最近的城市) 於是第三年,我們分別在台北、新⽵竹、台中、⾼高雄辦了六場的 iOS Dev Club 開環 島開發這聚會,我們到這幾個城市拜訪當地的 iOS 開發社團、專業的程式設計社 團,互相交流也互相認識。 ! 第四年,我們來到了台中市⻯⿓龍井區的蘋果貓咖啡舉辦,我們除了在這裡每個⽉月 舉辦⼀一次之外,也會陸續在每週都有研習課程加⼊入,請⼤大家密切注意我們在 Facebook 粉絲專⾴頁發佈的活動資訊。 http://iosdev.club/
  47. 47. iOS Dev Club 環島開發聚#1 臺北 2013/5/26
  48. 48. iOS Dev Club 環島開發聚#2 新⽵竹 2013/6/29
  49. 49. iOS Dev Club 環島開發聚#3 ⾼高雄 2013/07/27
  50. 50. iOS Dev Club 環島開發聚#6 臺北 2013/11/30
  51. 51. WWDC 2014 研習分享 2014/06/28
  52. 52. Apple 9/9 發表會後的設計須知 開發者的頭豈⽌止於⼤大 2014/09/27
  53. 53. Apple 9/9 發表會後的設計須知 開發者的頭豈⽌止於⼤大 2014/09/27
  54. 54. iOS Dev Club 資源
  55. 55. http://iosdev.club
  56. 56. https://www.facebook.com/ios.dev.club
  57. 57. https://www.youtube.com/user/iOSDevClub
  58. 58. https://github.com/iOSDevClub
  59. 59. 有問題 請上 iOS Dev Club https://www.facebook.com/ios.dev.club
  60. 60. http://taichung.iiiedu.org.tw/swift.html
  61. 61. Thanks for coming ! @evillon appletone.tw@gmail.com
  • williammdavis

    Dec. 23, 2016
  • zhihe754

    Sep. 30, 2016
  • chiehwenyang

    Sep. 27, 2015
  • ssuser1871b6

    Aug. 18, 2015
  • lambmei

    Jul. 22, 2015
  • happymanx

    Jul. 15, 2015
  • checkincheckin

    Jan. 5, 2015
  • goodjack1

    Jan. 5, 2015
  • lincyu1975

    Jan. 5, 2015
  • PoShengHsu

    Dec. 26, 2014
  • allenlinli

    Dec. 26, 2014
  • allenwang31924

    Dec. 25, 2014
  • hanyu100

    Dec. 17, 2014
  • freeloopxtw

    Dec. 16, 2014
  • wei0826

    Dec. 13, 2014
  • forthy

    Nov. 14, 2014
  • gendou915

    Nov. 3, 2014
  • eosinchen

    Oct. 31, 2014
  • chrischeng31

    Oct. 29, 2014
  • visioncan

    Oct. 28, 2014

今年 Apple WWDC 2014 發表新的程式語言 Swift,造成全世界熱烈討論,在這個 典範轉移 (Paradigm Shift) 的過渡時期,我們要做好哪些準備呢? 當全世界的程式語言(包含 Swift、Java),都往 Functional Programming 發展,我們要先來了解一下,什麼是 Functional Programming,可當作是迎接 Swift 新語言挑戰之前的先修班。 什麼是 ReactiveCocoa? ReactiveCocoa 是由 GitHub 發表,來自于兩位大師 Josh Abernathy & Justin Spahr-Summers 所創造而來,主要將 Functional Reactive Programming 概念注入 Objective-C。 Functional Reactive Programming 一般程式週期為 Input 到 Output 的處理轉換,Input 可以是來自于 資料、Web Service、鍵盤事件...等,Output 可以是 使用者UI 或 存入檔案,ReactiveCocoa 提供開發者另一個資料輸入輸出的新思維,將複雜的程式邏輯,用簡潔的方式解決。 Mattt大神說「ReactiveCocoa 是 Objective-C 的新紀元」 Justin DeWind「ReactiveCocoa 將是 Cocoa 的未來」

Views

Total views

4,900

On Slideshare

0

From embeds

0

Number of embeds

2,114

Actions

Downloads

35

Shares

0

Comments

0

Likes

32

×