摸鱼精选第 6 期

1. Redux-like state container in SwiftUI

Redux 的思想在开发 UI 的现代语言里都适用。

这是一个系列文章:

2. SwiftUI Stack Custom Center Alignment

每一行只有一个元素时,垂直居中很容易,但是当某一行有多个元素,需要指定某一个元素居中的时候就需要自定义了。

3. 不透明类型和协议类型之间的区别

作者针对 Swift 5.1 新增的特性 Opaque Types 进行梳理。

4. 企业微信超大型工程-跨全平台 UI 框架最佳实践

企业微信现在使用了大量的 Flutter 技术

  • pigeon :和 native 通信时,需要定义接口协议,使用 pigeon 可以自动生成 method channel 的代码
  • dart ffi
  • 性能优化:图片缓存部分和 native 共享图片
  • svg 和 iconFont 的使用
  • 多语言框架
  • 主题

5. 抖音 iOS 最复杂功能的重构之路--播放器交互区重构实践

本文以抖音中最为复杂的功能,也是最重要的功能之一的交互区为例,和大家分享一下此次重构过程中的思考和方法,主要侧重在架构、结构方面。

6. Redis 最佳实践:7 个维度+43 条使用规范,带你彻底玩转 Redis

作者从以下七个维度分析 Redis 的最佳实践优化:

  • 内存
  • 性能
  • 高可靠
  • 日常运维
  • 资源规划
  • 监控
  • 安全

7. 深入了解 JavaScript 引擎精华

本文来自 Google 引擎 V8 工程师 Mathias 和 Benedikt 在 JSConf EU 2018 上的演讲。他们对所有 JavaScript 引擎中常见的一些关键基础内容进行了介绍。

全文共由五个部分组成:

  1. JavaScript 引擎工作流程:介绍 JavaScript 引擎的处理流水线,这一部分会涉及到解释器/编译器的内容,且会分点介绍不同引擎间的差别与共同点;
  2. JavaScript 对象模型;
  3. 属性访问的优化:通过 Shapes、Transistion 链与树、ICs 等概念的穿插介绍引擎是如何优化获取对象属性的;
  4. 高效存储数组;
  5. Take-aways:对全文内容做了一个小结,并给了两点建议。

8. iOS 微信全文搜索技术优化

目前 iOS 微信已经将这套新全文搜索技术方案全量应用到聊天记录、联系人和收藏的搜索业务中。使用新方案之后,全文搜索的索引文件占用空间更小,索引更新耗时更少,搜索速度也更快了,可以说全文搜索的性能得到了全方位提升。

9. 19 条跨端 c++ 开发有效经验总结

有点类似于阿里巴巴的Java 开发手册,更多的是一些规范的总结。

其实我认为每个 C++开发者都应该关注 Google C++ Style Guide,这是 Google 这种完全工程师文化的公司得出来的经验总结,是非常有参考意义的。

10. 压箱底的音视频学习资料以及面经整理

音视频算是程序开发里面专业性比较强的垂直领域了,这两年直播、短视频的飞速发展,对音视频开发人员的需求那是爆发性的,但是要入门这个不容易,要做好就更难了。难点主要在于编码,推流,解码,渲染,每一个都是很有挖掘潜力的。当然这里指的是自主研发,而不是用别人的 SDK。

音视频的终极目标就是用更小的带宽流量承载更高清的视频,更小的延迟。

11. 一位大佬对于 Qt 学习的最全总结(三万字干货)

前面一堆的插科打诨语录,从第三节的"开发经验总结"看起。Qt 现在发版本很快,整体来说对 C++开发者来说是比较友好的,尤其是 PC 桌面软件,包大小方面肯定小于 Electron 了,做一些耗性能的软件也比较适合。

不过看看作者踩过的坑也蛮多,在选型时要慎重。

12. Flutter Riverpod 全面深入解析

应该和和下一篇结合起来看,Riverpod 现在有点替代 Provider 的意思,两个库的作者都是同一个人,Riverpod 没有依赖 BuildContext ,在任何地方都可以使用。

现在跨组件状态管理的趋势是 InheritedWidget -> Provider -> Riverpod。

13. Flutter 状态管理-Provider 的使用和源码解析

Provider 现在还是最流行的状态管理库,虽然有点被 Riverpod 超过的趋势。Provider 其实就有点生产者-消费者的概念,类似于 React 里面的 Context 用法,借助于 InheritedWidget 实现父与子之间的数据共享、实时变化。

作者最后还比较了一些其他的状态管理框架,比如 Redux 和 BLoC。

13. Swift 演进之路

作者列举了从 Swift 1.0 开始到 5.5 版本的主要特性。

其实也可以看官方 Document Revision History,里面的更新历史会更详细实时。

2019-03-25 更新了 Swift 5.0 版本,到现在差不多 3 年了。

14. The Complete Guide to SF Symbols

iOS 13 之后,系统增加了一些内置的SF Symbols矢量图标,类似于 Flutter 里面的内置 Material Disign 图标一样, 到 iOS 15 的时候已经有 3300 个符号了。

iOS 13 只有单色可以设置,iOS 15 可以分 2-3 层的渲染模式,设置不同 的层设置不同的颜色。

Image(systemName: "questionmark.circle")
    .resizable()
    .foregroundStyle(Color.red)
    .frame(width: 50, height: 50)

15. SwiftUI Custom Styling

SwiftUI 的组件有些样式的modifier, 比如.buttonStyle(), .toggleStyle(), .pickerStyle(), .textFieldStyle()

但是不是所有的组件都是可以自定义的,需要XXXStyle协议暴露公共接口makeBody才行。比如ButtonStyle的定义:


public protocol ButtonStyle {

    associatedtype Body : View

    @ViewBuilder func makeBody(configuration: Self.Configuration) -> Self.Body

    typealias Configuration = ButtonStyleConfiguration
}

实现自己的 Button 样式就可以如下:

struct MyButtonStyleExample: View {
    var body: some View {
        VStack {
            Button("Tap Me!") {
                print("button pressed!")
            }.buttonStyle(MyButtonStyle(color: .blue))
        }
    }
}

struct MyButtonStyle: ButtonStyle {
    var color: Color = .green

    public func makeBody(configuration: MyButtonStyle.Configuration) -> some View {

        configuration.label
            .foregroundColor(.white)
            .padding(15)
            .background(RoundedRectangle(cornerRadius: 5).fill(color))
            .compositingGroup()
            .shadow(color: .black, radius: 3)
            .opacity(configuration.isPressed ? 0.5 : 1.0)
            .scaleEffect(configuration.isPressed ? 0.8 : 1.0)
    }
}

还有 toggle 组件的 ToggleStyle也可以自定义。

PickerView、TextField 不能自定义。

作者最后还介绍了自定义组件的自定义样式,用类似原生的方式来写接口,有点复杂,需要借助@Environment来更新样式。