摸鱼精选第 29 期

1. Flutter 闲鱼知识小报

闲鱼团队的开发 tips 集合,包括 Flutter、前端、后端等内容。

2. C++ 并发编程(从 C++11 到 C++17)

自 C++11 标准以来,C++语言开始支持多线程模型。借助多线程模型,我们可以开发出更好的并发系统。本文以 C++语言为例,讲解如何进行并发编程。并尽可能涉及 C++11,C++14 以及 C++17 中的主要内容。

备份地址:https://mp.weixin.qq.com/s/FZZn2Npsqh1aVKtg4WXnQw

3. 如何利用 IOC 改善工程设计

控制反转 (Inversion of Control) 及其背后的 SOLID 设计原则已经非常成熟,并且在传统软件开发领域得到了验证。

本文从 JavaScript 生态出发,结合领域内流行的基础设施和成功的项目样例,对这套这套方法论进行重新审视。

4. 通过 React Router V6 源码,掌握前端路由

如题。

5. 百度 APP iOS 端内存优化-原理篇

本文介绍了 Mach 虚拟内存的特点、内存管理的数据结构以及 Mach 内核提供的内存操作接口,同时对 OC 内存分配核心函数 alloc 做了源码分析,此外对 iOS 端内存报警机制做了详细的源码分析。

6. 社交场景下 iOS 消息流交互层实践

本文对团队 IM 场景的现状做了简单介绍,撇开具体实现细节,就如何搭建一套能够适应多业务需要的通用 IM 消息流交互层方案,提供了一些思考和实践经验。

7. 深入分析 LINUX 内核源码

这本书名为《深入分析 Linux 内核源码》,2002 年出版,作者是陈莉君。这是一本关于 Linux 内核 2.4 版的源代码分析的书籍,共分为 13 章。本书旨在帮助读者深入了解 Linux 操作系统的内部结构和工作原理,涵盖了中断机制、进程调度、内存管理、进程间通信、虚拟文件系统、设备驱动程序和网络子系统等方面的内容。

8. Creating Optional @ViewBuilder Parameters in SwiftUI Views

@ViewBuilder 对于构造函数传入子视图的时候非常有用,因为加了@ViewBuilder之后,可以条件嵌套或者空实现,对类型没有太多限制。 但是有一个不太友好的地方在于,SwiftUI 不支持可选类型的 @ViewBuilder,即下面这种用法不支持:

init(@ViewBuilder contentBuilder: (() -> Content)?){
    self.content = contentBuilder()
}

当然,我们可以改进一下,将 content设为 Content?

struct Card <Content : View> : View {
    let content: Content?

    init(@ViewBuilder contentBuilder: () -> Content?){
        self.content = contentBuilder()
    }

    // 3. SwiftUI allows an optional View in a @ViewBuilder
    var body: some View {
        content
            .padding()
            ...
    }
}

struct Card_Previews: PreviewProvider {
    static var previews: some View {
        Card { }
    }
}

但是上面的用法有一些不太友好,我们依然需要传入一个空的闭包。如果当contentnil时想要默认值,我们还在body重写一遍 if 逻辑。

我们可以利用 Swift 的新特性,在泛型类的扩展里可以使用 where 限定泛型的类型,比如我们限定 ContentColor

extension Card where Content == Color{
    // 2. An init that makes the card blank if no parameter is passed
    init() {
        self.init {
            Color.white
        }
    }
}

这样,我们相当于创建了一个默认的初始化函数。

下面是完整的代码:


struct Card <Content : View> : View {

    let content: Content

    init(@ViewBuilder contentBuilder: () -> Content){
        self.content = contentBuilder()
    }

    // 1. Our contextually limited init function
    init() where Content == Color {
        self.init {
            Color.white
        }
    }

    var body: some View {
        content
            .padding()
            .background(Color.white)
            .cornerRadius(8.0)
            .shadow(color: .gray, radius: 10, x: 5, y: 5)
    }
}

struct Card_Previews: PreviewProvider {
    static var previews: some View {
        // 4. We still have to pass a closure
        Card()
            .padding()
    }
}

9. Wrapping delegates with Swift async/await and continuations

将闭包或者 Delegate 转成 async 异步方法, 主要是以下四个函数的使用:

  • withCheckedContinuation()
  • withCheckedThrowingContinuation()
  • withUnsafeContinuation()
  • withUnsafeThrowingContinuation()

withCheckedContinuation 方法中的checked 会在运行时对操作进行检查:是否调用resume进行返回。如果不调用会造成资源泄露。多次调用也会造成问题。 continuation 有且只能 resume 一次。

withUnsafeContinuation 的工作机制和withCheckedContinuation 一致,唯一区别在于运行时不会对操作进行检查。但性能更好。实际使用中withCheckedContinuation测试没有问题后,正式发布时使用withUnsafeContinuation

10. SwiftUI 的 NavigationView 的基础讲解与进阶实践

在本文中我们介绍了NavigationViewNavigationLink的基础用法和项目实践中的进阶用法,包括但不限于:

  • 除了navigationBarTitle外的其他修饰器的作用和使用方法。
  • 通过UINavigationBar.appearance()的其它属性和函数个性化配置标题栏的技巧。
  • 其它利用isActive绑定完成push的技巧。

11. How the relative size modifier interacts with stack views

AI 总结: 这篇文章主要讲述了如何在 SwiftUI 中使用相对大小来布局堆栈中的视图。文章详细介绍了如何在 HStack 和 VStack 中使用 GeometryReader 和 .frame() 修饰符来实现相对大小的布局。通过这种方法,开发者可以根据父视图的大小来调整子视图的大小,从而实现更加灵活和自适应的布局。文章还提供了一些实际的代码示例,以帮助读者更好地理解如何在实际项目中应用这些概念。通过遵循文章中的方法,开发者可以在 SwiftUI 项目中创建出更加美观和响应式的用户界面。

12. Working with percentages in SwiftUI layout

AI 总结: 文章详细介绍了如何使用 GeometryReader 和 .frame() 修饰符来调整视图的大小,使其根据父视图的大小进行自适应。​

13. Let’s Write a Web Browser from Scratch in Swift!【Part 1】

【Part 2】

AI 总结: 这是关于用 Swift 语言从零开始编写一个网络浏览器引擎的系列文章。在第一部分中,作者构建了一个基本的 HTML 解析器,介绍了标记化、解析等概念。在第二部分中,文章主要讨论了如何实现浏览器的基本功能,如后退/前进栈、地址栏、文档视图等,还探讨了如何处理内联元素的布局问题,以及如何在未设置样式的 HTML 页面上呈现 body 元素。

14. Riverpod and Bloc packages: comparison

AI 总结: 这篇文章主要对比了 Riverpod 和 Bloc 这两个 Flutter 状态管理和依赖注入的包。文章指出,将 Riverpod 和 Bloc 进行对比并不完全正确,因为它们都可以分为依赖注入和状态管理两部分。​Bloc 使用自己的 Provider 扩展进行依赖注入,并使用 Bloc 或 Cubit 类进行状态存储。而 Riverpod 则是 Provider 2.0,用于依赖注入,并附带了 State Notifier 包进行状态管理。文章还讨论了在 widget 中使用 Bloc 和 Riverpod 消费状态的不同场景,并提到了 Riverpod 提供的额外实用功能,如 AsyncValue 类,用于区分不同状态。​

15. Flutter Clean Architecture with Riverpod and Supabase

AI 总结: 这篇文章主要讲了如何在 Flutter 项目中使用 Riverpod 和 Supabase 实现 Clean Architecture(干净架构)。​Clean Architecture 是一种软件架构设计原则,旨在使代码更易于理解、测试和维护。文章详细介绍了如何使用 Riverpod 进行状态管理和依赖注入,以及如何将 Supabase 作为后端服务与 Riverpod 结合使用。文章还提供了一些实际的代码示例,以帮助读者更好地理解如何在实际项目中应用这些概念。通过遵循 Clean Architecture 原则并使用 Riverpod 和 Supabase,开发者可以创建出更加健壮、可扩展和易于维护的 Flutter 应用程序。​

16. 人人都能学的会 C++协程原理剖析与自我实现

本文将会深入讨论 C/C++函数调用过程,执行过程,返回过程,这些是协程实现的基础,涉及部分汇编代码设计与分析,只有从汇编层次出发,才能揭示根本的原理,让我们不再停留表面。阅读本文之前先抛出一些相关问题,函数怎么提前返回?怎么手动模拟函数调用?函数参数到底怎么传?函数如何能跨调用层次返回?怎么能获取 EIP/RIP?函数怎么跳转到特定地址执行?函数怎么保存上下文?汇编中为什么要保存寄存器?汇编中怎么恢复栈?汇编怎么平衡栈?什么是stdcall 和cdecl?...如果这些问题你都很透彻了,肯定相信也能轻松理解协程,不用看这篇文章,也可以自己写出协程了。

17. async_simple 源码分析(上)

下篇:async_simple 源码分析(下)

async_simple 是阿里巴巴开源的轻量级 C++异步框架。提供了基于 C++20 无栈协程(Lazy),有栈协程(Uthread)以及 Future/Promise 等异步组件。async_simple 诞生于阿里巴巴智能引擎事业部,目前广泛应用于图计算引擎、时序数据库、搜索引擎等在线系统。连续两年经历天猫双十一磨砺,承担了亿级别流量洪峰,具备非常强劲的性能和可靠的稳定性。

async_simple2022-09-15-摸鱼精选第 19 期 有介绍。

18. 现代化工具链在大规模 C++ 项目中的运用

本文以现代化工具链作为线索,介绍我们实际工作中的大型 C++ 项目中现代化工具链的实践以及结果。

19. Python 源码剖析

本专栏带您深入探索 Python 3 源码,洞悉 Python 虚拟机的运行原理,并体会其中的精妙设计!

20. 谷雨同学的 C++ 教程

请注意,我只负责讲解 C++ 语法层面的知识。对于超过语法的问题(比如算法设计、计算机系统等)不在本书的讨论范围之内