BlockHook 在业界已经率先解决了在同步调用场景下对 Objective-C Block 的 AOP 问题。但也有很多场景是需要先调用一段自己的逻辑,然后再异步延时执行 Block。

比如从外部跳转到 App 某个页面前需要检查下登录态,如果未登录则需要走完登录流程后才能继续跳转页面,而几乎所有基于 Block callback 的路由组件都没提供路由拦截器的功能。不同的路由组件内部实现不同,想要实现拦截器就需要针对不同的内部实现来修改路由组件源码。

因此我实现了 BlockHook 的异步拦截功能,所有基于 Block 的路由组件就都有了通用的路由拦截器!

当然,Block 拦截器的应用场景不仅于此。只要是需要『同步改异步执行』 Block 的场景都可以用到。

让子弹再飞一会儿!

Read More

BlockHook 开创性地解决了 Objective-C 语言界 Hook Block 的问题,但也迎来了新的问题:

  1. 如何知道某个 Block 对象被谁 Hook 过?
  2. 多次 Hook 的先后顺序?
  3. 如何处理好多次 Hook 同一个 Block 后对任意一次 Hook 的撤销?

这些问题也是开发者在使用时向我反馈过的问题,在这篇文章里,这些问题都将会解决。

关于 BlockHook 的原理,可以先阅读之前的文章:

Read More

一年前,我开发了 BlockHook,(应该是)填补了 Objective-C 业界在 Hook Block 技术领域的空白。但是对于 Block 的参数和返回值有限制,仅定制了 CGRect, CGSize, CGPoint 等结构体,不支持自定义 struct。这次就把这个坑给填上。

至此,BlockHook 已支持 macOS 和 iOS 平台全架构、tvOS 和 watchOS 模拟器,BlockHook.m 测试覆盖率达到 92% 以上。

Read More

如何识别声音所蕴含的情绪呢?在大部分场景下,人声的情绪更有意义。可以先将人声转文字,再通过 NLP 分析语义情绪。不过人类语言博大精深,一句『卧槽』的不同语调和语境下会有很多种意义,真的是卧槽啊!

于是我从音频特征提取入手,将人声分类识别为八种情绪,实现了两个方案并都得到了测试集 70% 以上的准确率:

  1. 使用 VGGish 网络做特征提取,输入自定义网络进行训练。
  2. 使用音频库导出一系列特征作为输入向量,自定义网络进行训练。

Python 工程和 iOS Sample 开源在 GitHub 上了:https://github.com/yulingtianxia/AudioEmotion

Read More

在照片质量评分组件 PhotoAssessment 项目上,有些算法的实现是使用 CPU 运行的。通过使用 MPS(Metal Performance Shader) 在 GPU 上并行计算,显著提升了性能,算法执行耗时降低了 99.9% 以上。震惊,呵呵。随着性能上成百上千倍的提升,可以在相等时间内处理更大尺寸的图片,进而提升组件的准确度和用户体验。

至此,几乎所有图像处理与计算任务都交由 GPU 完成。之前利用 Sobel 算子边缘检测是使用了苹果封装好的 MPS 类,剩余的色彩分布指纹向量和饱和度均值当然都是需要自己写 Shader 的,现在终于补齐了。Metal Shading Language 与 GLSL 使用习惯和理念很相似,只不过 Metal Shader 的语法是基于 C++ 14 的。

关于整个组件的实现思路,可以查阅『使用 Metal 和 Core ML 评价照片质量』。本篇文章所涉及到的 Shader 代码 也在其中。

Read More

最近在搞 iOS MVVM 框架,虽说是 N 年前就老生常谈的知识了,但设计模式毕竟是只一种规范,无法约束项目中所有程序员都去遵循。我做了个 OCLint 的自定义规则,对 ViewModel 运行静态检查。

然而过程中踩了不少坑,OCLint 的官方 Repo 早已失效,可以使用我修改后基于 LLVM 7 的版本:https://github.com/yulingtianxia/oclint/tree/llvm-7.0

伸手党也可以使用我写的脚本直接安装,已包含 MVVM 规则。

Read More

开发者经常会在代码中看到各类脏话,有吐槽产品的瞎改早晚还会改回来的,有吐槽这块代码写的太烂无法直视的,或是干脆心情不好就一顿骂。公司内部的项目想必是无数天坑 f*ck 无数,连对外开源的项目也难逃一劫,比如前一段时间 OpenJDK 就因为脏话太多火了一把。

于是我做了一个 Xcode 插件来寻找代码中的脏话,将其高亮可以被选中,作为一个强提示让开发者修改。目前逻辑还只是简单替换而已,代码在这里:DirtyWords-for-Xcode

为了体现汉字的博大精深,瞎画了个 icon,见笑了:

Read More

如何评价一张照片的质量呢?

用算法可以客观地评价照片质量,也可以人为主观地给照片打分,并运用机器学习来训练模型。

我用 Swift 写了个 Demo。用苹果的 Metal 跑一些算法得出客观评分,再用 Core ML 预测主观评分。得到照片评分后,就可以检测相似照片,并从中挑选最优的照片推荐给用户。

Demo 中展示了图片在 NIMA 模型预测结合人脸识别的主观评分、图片的 HSB 色彩空间、以及边缘检测结果的平均值和方差。代码兼容 iOS 和 macOS。下面示例图片拍摄自胡里山炮王和西塘。

Read More