這裏記錄過去一個月,我看到的值得分享的內容,包含但不限於iOS知識,每個月的最後一天發佈。 歡迎推薦內容,可以前往zhangferry/iOSMonthlyReport提交issue。
Tips
Golbal queues的優先級
如果要在後臺執行非UI相關的工作, 一般把這部分工作放在Global queue. Global queue是一種系統內共享的並行的隊列。申請Global queue的方法很簡單:
let userQueue = DispatchQueue.global(qos: .userInitiated)
複製代碼
其中後面的.userInitiated
參數代表隊列的優先級。該優先級公有6中分類,有高到低爲:
userInteractive>default>unspecified>userInitiated>utility>background
通過該段代碼驗證:
for i in 1...3 {
DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async {
NSLog("DispatchQoS.QoSClass.default, %d", i)
}
DispatchQueue.global(qos: DispatchQoS.QoSClass.background).async {
NSLog("DispatchQoS.QoSClass.background, %d", i)
}
DispatchQueue.global(qos: DispatchQoS.QoSClass.unspecified).async {
NSLog("DispatchQoS.QoSClass.unspecified, %d", i)
}
DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).async {
NSLog("DispatchQoS.QoSClass.userInitiated, %d", i)
}
DispatchQueue.global(qos: DispatchQoS.QoSClass.userInteractive).async {
NSLog("DispatchQoS.QoSClass.userInteractive, %d", i)
}
DispatchQueue.global(qos: DispatchQoS.QoSClass.utility).async {
NSLog("DispatchQoS.QoSClass.utility, %d", i)
}
}
複製代碼
其中userInitiated
爲LIFO(後進先出)
,即如果有新插入的userInteractive
級別的隊列任務,爲先執行新任務之後再執行之前該級別任務。其餘優先級的隊列任務均是FIFO(先進先出)
。
“No such module” when using @testable in Xcode Unit tests
因爲測試工程和主工程分屬不同Module
,所以如果我們想在測試項目中調用主工程代碼需要導入主工程:
@testable import moduleName
複製代碼
這個時候如果報以上錯誤,會有以下可能:
1、targetName錯誤
這個可以去Target->Build Setting->Product Module Name
確認。
2、主工程和測試模塊支持版本號不一致
保證Build Setting->iOS Deployment Target
中的版本號在主工程和測試工程中一致。
authenticating with the app store上傳卡頓
如果往AppStoreConnect傳包一直卡在這個步驟,可以試一下這種方式:
第一步:
cd ~
第二步:
mv .itmstransporter/ .old_itmstransporter/
第三步:
"/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/itms/bin/iTMSTransporter"
等待執行完成。
訂閱的freetrial沒有標明截止時間被拒
如題,如果訂閱功能含freetrial,一定要在freetrial按鈕旁邊標清楚試用的截止時間。
WakaTime
一款能夠統計開發時間的網頁端應用,支持衆多IDE。
集成到IDE之後,註冊賬號然後會獲取到一個Key,綁定該值。然後當我們愉快的開發時,一些開發的信息就會被記錄下來。我們可以通過其網頁端的dashboard查看我們開發的情況。 因爲前幾天升級XCode,需要重新裝插件,所以最近幾天的開發記錄爲空。Lookin | 免費好用的iOS UI調試軟件
出自QMUI團隊,可能是小集的影響力已經很大了,這個軟件首發之後竟發現已經有一衆人開始關注這個東西了。可能因爲UI調試這個操作是一個高頻的行爲,而Xcode目前又做的不夠好,所以大家都期待有一個高效的UI調試工具。我也是下下來試了下,結合之前對Reveal和Sherlock的使用,說下自己的體會吧,首先是優點: 1、免費 2、支持動態修改UI元素屬性,例如位置,顏色,圓角這些 3、可以查看CALayer的信息 因爲是剛發佈沒多久,還是有些需要改進的地方的 1、動態修改UI元素的信息,均是通過UIView,和CALayer的信息進行修改,無法實現像UILabel改文案,更新行數等操作 2、3D的渲染有時候會有bug出現,位置不正確,另外僅支持一個左右的旋轉不支持上下 3、屏幕適配還不支持,不能修改屏幕 其實我對sherlock也都僅限於使用,中和頻率不高的使用性和高昂的費用,我選擇試用結束就放棄,雖然Lookin還存在一些不足,但是免費大於一切啊,希望可以做的更好,爲更多開發者帶來便利。
Github
R.swift
Android開發中引用資源可以通過R機制
,所謂R機制
就是在我們創建一個Android項目的時候,IDE會自動幫我們創建一個名爲R的類型,它所在的文件名稱也是叫做R.java,R類型中沒有任何方法,包含的是代表不同類型資源的內部靜態類,而這些內部靜態類中,也只有靜態的屬性,每個屬性代表一個資源,故我們要引用某個資源類型中的某個資源,可用R.資源類型.資源名來引用。下面就是代碼中的實例:
// 從圖片資源文件夾中加載名爲"image_test"的圖片以其創建位圖
Bitmap aBitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.image_test);
複製代碼
相對來說iOS中的資源引用就麻煩很多,需要通過字符串引用,無法代碼補全,資源更換無法自檢查。解決iOS資源引用的這些問題而借鑑Android方案的R.Swift
應運而生。
傳統的方式:
let settingsIcon = UIImage(named: "settings-icon")
let gradientBackground = UIImage(named: "gradient.jpg")
複製代碼
使用R.Swift
let settingsIcon = R.image.settingsIcon()
let gradientBackground = R.image.gradientJpg()
複製代碼
不光圖片,它還支持Fonts
,Resource files
,Colors
,Localized strings
,Storyboards
,Segues
,Nibs
,Reuseable Cells
。
我第一次見到這玩意的時候就一個感受:wocao,🐂🍺!
更多關於R.Swift的使用規則參照官網說明。
Swift-Books
github上的內容,可以分爲兩類,純乾貨和乾貨的整理。這個庫屬於後者,是一個收錄Swift&Object-C相關資料的倉庫。收錄的都是比較經典的學習資料,而且非常全! 建庫已經兩年了,但是star卻不多,不知道是因爲曝光度的問題,還是因爲大家對設計版權問題的內容有些警惕。但不管怎樣吧,我還是要推一推這個庫。
open-source-ios-apps
開源的iOS應用列表。基本涵蓋了iOS開發涉及的所有領域,通過完整的app去學習別人的開發技巧是一個相對直觀的方式,面對這個大禮包,記得來看一看哈。
Chinese-Podcasts
中文博客的收錄,包含科技,風投,生活,電影,設計等領域。 音頻內容最大的優勢就是便捷,你可以在走路,跑步,甚至休息的時候使用它。音頻相比視頻還有一個更大的好處是,它會給大腦預留更多的想象空間,聽音頻我們會思考的更多一些。 去年一直在聽東吳同學會,最近一段時間則聽ggtalk和硅谷早知道多一些。
文摘
1、
生存是一種即時策略遊戲,所有的人都是這場遊戲的玩家。財務自由了,就是遊戲贏家。
--《科技愛好者週刊:66期》
2、
我以爲別人尊重我,是因爲我很優秀。慢慢的我明白了,別人尊重我,是別人很優秀;優秀的人更懂得尊重別人,對人恭敬其實是在莊嚴你自己。
3、
所謂成熟的人,就是精神上能夠自給自足的人。