原文连接javascript
上周公众号发布的如下文章:java
本期知识小集的主要内容包括:ios
做者: halohilyjson
在 iOS 中录音的需求很常见,对于大多数场景采用系统提供的 AVAudioRecorder
。指定一个音频文件存储路径,便可开启录音。然而,这样咱们只能在录音结束以后得到音频数据,没法实时进行。讯飞输入法的 ASR SDK
中提供了一个写入音频 data 的接口,就是指望咱们本身采用流式录音,录音过程当中能够实时得到音频数据,从而接连不断地传递给讯飞的 SDK。网络
对于流式录音,这里推荐使用 Audio Queue
实现。它一样是官方提供的组件,只不过相对于 AVFoundation
更底层一些。使用它录音,首先初始化一个音频队列 AudioQueue,而后是三个 buffer
,用来存储流式录音过程当中的每一帧音频 data。注意,经过 buffer
大小的不一样设置,便可实现每一帧时长的控制。最后,便是实现每一帧完成后的回调函数,在这个函数中完成音频数据的实时传递。app
相反的,它一样支持音频的流式播放。除此以外,它还能够知足对音频编码的不一样需求。函数
参考资料组件化
做者: 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.parse
和 JSON.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 交互的奥妙之处。
做者: Vong_HUST
今天分享一个最近使用 Xcode 遇到的一个坑。相信你们在写(或者看开源库)一些类,都会有一个匹配的 XXX+Private.h
、XXX+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,也欢迎加入咱们的群组讨论问题。能够公众号留言 ios
、flutter
等关键词获取入群方式。