用Swift在iOS演一齣舞台劇吧
Swift的演員模型架構
先上架構圖:
前言:
The world *is* parallel — we are parallel. ~ Joe Armstrong
因為之前有接觸過Erlang/Elixir,一直很喜歡Actor Model這個架構,現在前端硬體也是多核心的現在,似乎也可以透過這樣的分散式設計架構來達到高效、安全、無死鎖異步的程式。我一直相信當想法正確,這世界一定也有人在想同一件事,因此讓我發現了這個:Flynn
介紹:
Flynn 是一個受到Pony這個新語言啟發的架構框架,Elixir = Erlang + Ruby,Pony則是Erlang+Rust,都是可靠安全性高的新語言,Erlang VM 的 Actor Model一直是我心目中世上最好的並發模型沒有之一。而Flynn沒有使用DispatchQueues的作法,而是參考了Pony runtime,每個Actor都是一個極輕量的異步,用法可參考Git文檔或是這篇: Swift Actor-Model
Modules 介紹:
Stage:泛指所有UI的部分,Scene 就是UIController,只處理Scenery (View)的更新
Actor:就是演員模型的Actor,類似OOP的物件,跑在一個獨立線程,所有參數皆為私有(private),只透過訊息通知方式互動,依據SRP(Single responsibility principle),每個Actor都有各自負責的…叫橋段吧!
這是我寫的一個叫數學家的Actor,所有數學運算都由它來處理:
Scenario 腳本:
Scenario也是一個Actor,作用有點像ViewModel,但這邊Scenario功能就像字面上意思,去Create需要(演出?)的Actor,並描述這些Actor如何完成這個Scene的Behavior,Scene(Controller)則專注要呈現什麼在Stage
Controller程式會長這樣:
這樣Scenario就很清楚的描述這個畫面所有動作,我認為這樣相當容易閱讀,而且好寫測試好除錯,所有運算都跑在異步,UI Thread真的只處理UI,讓CPU資源被更好的使用,甚至也許也可以做出Elixir的LiveView
實作就是這麼簡單,不用懂太多的工具,也能輕鬆寫出高並發的App
I’m sorry that I long ago coined the term “objects” for this topic because it gets many people to focus on the lesser idea. The big idea is messaging.
— Alan Kay, OOPSLA ‘97