「 iOS知識小集 」2018 · 第 32 期

原文連接html

國慶小集團隊休息了兩週,如今咱們又回來了。整裝待發,後面咱們努力爲你們帶來更多更好的文章。ios

上週公衆號發佈的如下文章:git

本期知識小集的主要內容包括:github

  • 利用 GCD 信號量將異步方法改造爲同步方法
  • 提升開發效率 --- UI 部分
  • WKWebView 使用 WKWebViewJavascriptBridge 須要注意的地方
  • 開源庫使用的 Clang __attributes__

利用 GCD 信號量將異步方法改造爲同步方法

做者: halohilyobjective-c

有的時候,咱們會遇到一個同步方法(該方法的全部工做在返回以前已所有完成)的內部實現,須要依賴其餘異步過程的狀況。好比接口定義了一個開啓聊天會話的方法,返回值爲布爾值。從返回值類型不難推測,咱們但願這個方法返回之時,會話是否開啓成功就已經確切得知。然而,開啓會話的內部實現僅僅是向服務端發起鏈接請求,是否鏈接成功須要等待服務端的響應,顯然這是一個異步的過程。這就是一個常見的異步過程須要改造爲同步(對外表現同步)的場景。如何實現呢?能夠採用 GCD 的信號量:發起鏈接請求以前,建立一個初始值爲 0 的信號量,在方法返回以前請求該信號量(P 操做),同時,在鏈接請求的結果回調中釋放該信號量(V 操做)。這樣,發起鏈接請求後,因爲信號量初始值爲 0,會阻塞在請求信號量的地方,鏈接請求回調回來以後,釋放信號量,剛剛的信號量請求被知足,方法得以返回。這樣對外表現即爲一個同步且耗時的開啓會話操做,雖然這個場景比較彆扭,但與此相似的情景是很常見的。異步

在你們熟知的 AFNetworking 中,就有這樣的應用:函數

提升開發效率 --- UI 部分

做者: Lefe_x工具

最近在探索能夠提升開發效率的方法,目前先從 UI 方面入手,旨在可以快速的建立 UI,避免作不斷重複的工做,現初步找到幾種方法並開始實踐,但願對你可以有啓發,若是你有更好的想法,歡迎分享給我:學習

  • 使用文件模板:對於某些重複性比較大的 ViewController,能夠經過定義模板,這樣建立 ViewController 的時候直接使用模板建立,會節省一部分時間;若是有一套本身建立 UI 的命名規則,還會節省一部分時間,模板代碼越多,就越少寫多餘的代碼;
  • 使用代碼片斷:對於一些小功能,好比建立某個 Label,某個屬性;若是定義成代碼片斷,也會節約一部分時間;有了代碼片斷,那麼寫代碼就是成段成段的寫,這裏須要注意定義代碼片斷時命名規則,避免因爲忘記代碼片斷的名字浪費查找的時間;
  • 積累本身的UI庫:其實不少 UI 在其它項目中已經寫過了,若是平時注重積累,那麼不少 UI 直接搬過來既可使用,這裏寫 UI 時要記得解耦,UI 部分儘可能不要與項目耦合,這樣複用性更強;
  • 統一管理 UIColor:一個 APP 中經常使用的顏色就那麼幾種,這些顏色使用 Color set 統一管理,優勢就是你不須要不斷地看某個字體的顏色是什麼,某個 view 的背景顏色是什麼,直接調用已經建立的顏色便可,好比:+ (UIColor *)lef_blackColor;
  • 使用Sketch:你每每會抱怨 UI 切的圖,標記的位置並非你想要的,反覆的和 UI 要切圖,要顏色,若是使用好 Sketch 這個工具,不少圖你本身均可以搞定,不過有的 UI 使用的是 PS 那就尷尬了;
  • 系統學習 UI 知識:當你花了好大力氣實現某個 UI 效果後,發現系統提供了一個 API,一句話就實現了,內心一萬個草泥馬,你所謂遇到的坑,每每就是沒有系統地學習 UI 的原理,致使遇到莫名其妙的問題不知如何下手。

WKWebView 使用 WKWebViewJavascriptBridge 須要注意的地方

原生端與 H5 端交互,比較經常使用的就是 WebViewJavascriptBridge。建橋過程這邊再也不贅述,只要下載 Github 上的 Demo 參考便可,OGitHub - marcuswestin/WebViewJavascriptBri...。字體

注意點一:Run 之後會捕捉到一個 Crash,在官網的 Demo 裏一樣會有這個 Crash,如圖一。這個 Crash 只有在用 WKWebView 裏會出現,用 UIWebView 是好的。

解決方法:在 WKWebViewJavascriptBridge.m 文件line 150 後面加一行代碼。如圖二。參考 issue :github.com/marcuswesti… 。不知爲什麼,做者沒有合併該 issue,源碼裏也未修復。所以用 cocoapods 集成庫的同窗,每次 pod install 後要檢查源碼中是否有添加上述一行代碼。

注意點二:註冊 bridge 後,與 H5 的交互沒法成功。

解決方法:檢查一下 H5 小夥伴代碼裏有沒有圖三代碼段落。這一段 js 代碼是不能改的,需原樣複製。查看源碼發現,在 WKWebViewJavascriptBridge.m 文件 line 135 方法中,[_base injectJavascriptFile] 是注入 js 文件,也是交互的關鍵。在執行這行代碼以前,有 [_base isBridgeLoadedURL:url] 這個判斷,點進去查看該判斷的實現,發現兩個宏 kCustomProtocolSchemekBridgeLoaded ,分別對應 @"wvjbscheme"@"__BRIDGE_LOADED__" 。 這也就跟圖三代碼中的 WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__'; 對上了。

開源庫使用的 Clang __attributes__

做者: Vong_HUST

今天和你們分享一下第三方開源庫使用到的一些實用的 Clang attributes

圖1出自 PSPDFUIKitMainThreadGuard————一個用於檢測是否在非主線程調用 UI 相關的工具,使用的是 __attribute__((constructor)),被該修飾符修飾的函數(僅對 C 函數生效),會在 main 函數以前執行,可是稍微比 +load 晚一點,由於 dyld 調用完 image 中全部類的 load 方法以後纔會調用 image 中的 constructor。這個修飾符支持優先級的設置,如 __attribute__((constructor(1024))),其中 1~100 爲系統保留。

下面代碼出自 YYModel,修飾符 __inline__ __attribute__((always_inline)) 意味着強制內聯,什麼意思呢?就是它看起來是一個函數,可是編譯的時候,會被編譯器優化,至關於把函數體內代碼直接插入到被調用的地方,這樣就避免掉了一些壓棧、返回等操做,加快調用。

固然系統也有不少宏是對 Clang attributes 的封裝,一些系統封裝宏代碼以下,更多例子能夠自行查看系統頭文件。

參考連接:

關注咱們

歡迎關注咱們的公衆號:iOS-Tips,也歡迎加入咱們的羣組討論問題。能夠公衆號留言 iosflutter 等關鍵詞獲取入羣方式。

相關文章
相關標籤/搜索