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

栏目: IOS · 发布时间: 6年前

内容简介:作者:halohily在 iOS 中录音的需求很常见,对于大多数场景采用系统提供的对于流式录音,这里推荐使用

作者:halohily

在 iOS 中录音的需求很常见,对于大多数场景采用系统提供的 AVAudioRecorder 。指定一个音频文件存储路径,即可开启录音。然而,这样我们只能在录音结束之后获得音频数据,无法实时进行。讯飞输入法的 ASR SDK 中提供了一个写入音频 data 的接口,就是期望我们自己采用流式录音,录音过程中可以实时获得音频数据,从而接连不断地传递给讯飞的 SDK。

对于流式录音,这里推荐使用 Audio Queue 实现。它同样是官方提供的组件,只不过相对于 AVFoundation 更底层一些。使用它录音,首先初始化一个音频队列 AudioQueue,然后是三个 buffer ,用来存储流式录音过程中的每一帧音频 data。注意,通过 buffer 大小的不同设置,即可实现每一帧时长的控制。最后,即是实现每一帧完成后的回调函数,在这个函数中完成音频数据的实时传递。

相反的,它同样支持音频的流式播放。除此之外,它还可以满足对音频编码的不同需求。

参考资料

Audio Queue Services

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":"亲爱的安德烈"}]}}
复制代码

上面这中方式,看起来非常不友好。如果能够显示成下图的格式,是不是很爽?我们来看看具体的实现。

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

想实现上面的效果,可以使用 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 背。

最后如果你也和我有一样的困扰,可以尝试去除文件名中的+号,虽然麻烦了一点,但至少能用了:joy:。


以上所述就是小编给大家介绍的《「 iOS知识小集 」2018 · 第 36 期》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Access2003数据库开发典型范例

Access2003数据库开发典型范例

王樵民 / 第1版 (2006年8月1日) / 2006-8 / 42.00元

Access数据库管理软件是一套集数据管理、程序开发功能于一体的高级办公软件,是特别适合普通办公人员进行日常工作的有力助手。本书面向非计算机专业人员,通过多个实例讲解Access中的各种开发技术,介绍实际工作过程中应用软件的编制方法,以及与Excel等软件之间的信息互用技术等内容。能够帮助读者快速掌握Access数据库的开发技术,构建解决自己工作中实际问题的数据库管理系统,从而提高办公效率。一起来看看 《Access2003数据库开发典型范例》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试