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

原文連接javascript

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

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

  • 使用 Audio Queue 進行流式錄音
  • JSON 格式化顯示
  • Xcode 10 文件沒法關聯的 bug

使用 Audio Queue 進行流式錄音

做者: halohilyjson

在 iOS 中錄音的需求很常見,對於大多數場景採用系統提供的 AVAudioRecorder。指定一個音頻文件存儲路徑,便可開啓錄音。然而,這樣咱們只能在錄音結束以後得到音頻數據,沒法實時進行。訊飛輸入法的 ASR SDK 中提供了一個寫入音頻 data 的接口,就是指望咱們本身採用流式錄音,錄音過程當中能夠實時得到音頻數據,從而接連不斷地傳遞給訊飛的 SDK。網絡

對於流式錄音,這裏推薦使用 Audio Queue 實現。它一樣是官方提供的組件,只不過相對於 AVFoundation 更底層一些。使用它錄音,首先初始化一個音頻隊列 AudioQueue,而後是三個 buffer,用來存儲流式錄音過程當中的每一幀音頻 data。注意,經過 buffer 大小的不一樣設置,便可實現每一幀時長的控制。最後,便是實現每一幀完成後的回調函數,在這個函數中完成音頻數據的實時傳遞。app

相反的,它一樣支持音頻的流式播放。除此以外,它還能夠知足對音頻編碼的不一樣需求。函數

參考資料組件化

Audio Queue Servicesui

JSON 格式化顯示

做者: Lefe_x編碼

有時候咱們想查看網絡請求的內容,咱們每每看到的結果是(格式很是混亂):

{"status":{"msg":"success","code":0},"data":{"book_info":[{"doc_id":"a4bdba4cf7ec4afe04a1df7c1","author":"Lefe_x","is_white_book":0,"rec_tag":"熱門推薦","small_cover_url":"http:\/\/a3.att.hudong.com\/42\/58\/01300000820274128088583100471.jpg","rec_reason":"十分好看","book_title":"孩子你慢慢來"},{"doc_id":"a4bdba4cf7ec4afe04a1df7c3","author":"林語堂","is_white_book":0,"rec_tag":"","small_cover_url":"http:\/\/image.hexun.com\/book\/upload\/2013\/03\/07\/153148_20_c.jpg","rec_reason":"容易理解","book_title":"親愛的安德烈"}]}}
複製代碼

上面這中方式,看起來很是不友好。若是可以顯示成下圖的格式,是否是很爽?咱們來看看具體的實現。

想實現上面的效果,可使用 JS 中的 JSON.parseJSON.stringify 方法對 json 字符串轉換,把轉換後的結果使用 UITextView 或者 UILabel 顯示出來便可。使用 UITextView 的好處是,內容太長直接能夠滾動。圖中的實現方式是使用的 WKWebView,目的是給 Json 高亮(高亮代碼能夠參考 highlight.min.js)。

iOS 中調用 JS 中的方法咱們在知識小集的《一本走心的JS-NA 交互電子書》上有很詳細的講解,還不會 JS-NA 交互的朋友能夠在知識小集公衆號輸入 jn 便可免費得到。

把用到的 JS 方法定義到一個 JS 文件中,命名爲 json_parse.js

function parseJson(string) {
	try {
		return JSON.parse(string);
	} catch (error) {
		return null;
	}
}

function renderJson(json) {
	return JSON.stringify(json, null, 2);
}
複製代碼

iOS 端的代碼以下:

NSString *json = @"iOS中的json字符串";
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"json_parse" ofType:@"js"];
NSString *js = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
// 使用 JSContext 加載 JS 文件
[self.context evaluateScript:js withSourceURL:[NSURL URLWithString:@"json_parse.js"]];
// 調用 parseJson 方法
JSValue *parseJsonResultValue = [self.context[@"parseJson"] callWithArguments:@[json]]; 
// 調用 renderJson 方法
JSValue *renderJsonResultValue = [self.context[@"renderJson"] callWithArguments:@[[parseJsonResultValue toObject] ?: @""]];
// renderJson 就是咱們最終要顯示的字符串
NSString *renderJson = [renderJsonResultValue toString];
複製代碼

有時候在 iOS 中實現不了的需求,能夠想着用 JS 來實現,我以爲這是 iOS 與 JS 交互的奧妙之處。

Xcode 10 文件沒法關聯的 bug

做者: Vong_HUST

今天分享一個最近使用 Xcode 遇到的一個坑。相信你們在寫(或者看開源庫)一些類,都會有一個匹配的 XXX+Private.hXXX+Subclass.h 這種頭文件,裏面專門用來放主類的 Extension,主要用途是爲了讓某些屬性和方法模塊內「僅模塊內(或子類)可見」,這裏之因此加雙引號是由於在 Objective-C 中全部的公共頭文件在任何類中都能被 import 到,因此這裏的頭文件僅從命名上作一個隔離。Class Extension 的建立也很簡單,新建文件,而後選擇 Objective-C File,下一步 type 選 Extension 便可。確認後 Xcode 會自動生成一個 YourClass+XXX.h 的文件(XXX 爲你新建文件時輸入的內容)。可是此時若是使用快捷鍵(command+ctrl+↑/↓),發現沒法和主類關聯,即沒法跳轉到主類的 .h/.m。

這就很難受了,以前版本 Xcode 都是能夠的,具體從哪一個版本開始不能關聯沒有去關心,只關心如何解決。剛好最近有看 IGListKit 的相關代碼,發現裏面也大量使用了這種方式,可是它的 Extension 頭文件名都是相似 XXXInternal.h(好比 IGListAdapterInternal.h)這種,並且它是可以使用快捷鍵在主類和 Extension 之間跳轉的,難道是文件名的緣由致使的?後面手動把 YourClass+XXX.h 更名爲 YourClassXXX.h,而後發現仍是不行。可是 build 一下以後,又能像從前那樣使用快捷鍵愉快地在文件間切換了。不過值得一提的是,能用快捷鍵跳轉的僅 XXXX+Private.h 可行(同事的實踐),其他的目前試過的都不行。這鍋不知道該不應 Xcode 背。

最後若是你也和我有同樣的困擾,能夠嘗試去除文件名中的+號,雖然麻煩了一點,但至少能用了😂。

關注咱們

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

相關文章
相關標籤/搜索