普通视图

发现新文章,点击刷新页面。
今天 — 2025年6月9日首页

ByAI:iOS 生命周期:AppDelegate 与 SceneDelegate 中的 `willEnterForeground` 方法解析

作者 unravel2025
2025年6月9日 11:24

背景

苹果在 iOS 18.4 及后续版本中要求应用逐步迁移到基于场景的生命周期(Scene-Based Lifecycle) 。若未适配,系统会提示警告,未来版本甚至可能禁止未适配的应用启动。本文重点解析 applicationWillEnterForeground(AppDelegate)与 sceneWillEnterForeground(SceneDelegate)的差异。


核心差异

1. 作用范围不同

  • AppDelegate 的 applicationWillEnterForeground
    当整个应用从后台进入前台时触发,仅调用一次,适用于全局逻辑(如恢复网络连接、更新全局数据)。

    // AppDelegate.swift
    func applicationWillEnterForeground(_ application: UIApplication) {
        print("App 即将进入前台(全局)")
    }
    
  • SceneDelegate 的 sceneWillEnterForeground
    当单个场景(Scene)进入前台时触发。若应用支持多窗口(如 iPad 分屏),每个场景会独立调用一次,需避免重复执行全局逻辑。

    // SceneDelegate.swift
    func sceneWillEnterForeground(_ scene: UIScene) {
        print("场景即将进入前台(单场景)")
    }
    

2. 冷启动时的行为差异

  • 冷启动(首次启动应用)时

    • applicationWillEnterForeground 不会触发(应用尚未进入后台)。
    • sceneWillEnterForeground 会触发(场景初始化后即视为进入前台)。

迁移注意事项

  1. 避免代码重复执行
    若将 applicationWillEnterForeground 的代码迁移到 sceneWillEnterForeground,需确保多窗口场景下逻辑仅执行一次(例如通过单例或状态标记)。

  2. 区分全局与场景逻辑

    • 全局逻辑(如用户登录状态检查)建议仍在 AppDelegate 中处理。
    • 场景相关逻辑(如界面刷新)迁移到 SceneDelegate
  3. 无需紧急适配
    AppDelegate 目前仍被支持,但建议逐步迁移以适应未来强制要求。


测试与验证

  • 官方文档参考
    查阅 Apple UIKit 文档,确保实现符合最新规范。
  • 模拟多场景环境
    在 iPad 或支持多窗口的设备上测试,验证多场景下的逻辑正确性。

总结

方法 触发条件 调用次数 适用场景
applicationWillEnterForeground 应用全局进入前台 一次 全局状态恢复
sceneWillEnterForeground 单个场景进入前台 每个场景一次 场景相关界面更新

ByAI:使用DRY原则编写干净可复用的Swift代码

作者 unravel2025
2025年6月9日 10:40

什么是DRY?

DRY代表:不要重复你自己(Don't Repeat Yourself)

这个编程原则鼓励避免逻辑重复,通过函数/扩展/泛型等Swift工具复用代码。为什么?因为重复代码更难维护,增加bug风险,使代码库混乱难读。让我们通过实际示例看看如何实践DRY。


问题案例

典型的新手错误:

func greetUser(name: String) {
    print("Hello, (name)!")
}

func welcomeUser(name: String) {
    print("Hello, (name)!")
    print("Welcome to our app.")
}

这两个函数有重复逻辑。当需要修改问候语时,必须在两处同时修改,这违反了DRY。


DRY改造版

func greet(name: String) {
    print("Hello, (name)!")
}

func welcomeUser(name: String) {
    greet(name: name)
    print("Welcome to our app.")
}

现在问候逻辑集中在一处,修改时只需改一个函数,代码更易维护。


Swift中的DRY工具

1. 函数封装

改造前

print("Fetching data...")
// 业务逻辑
print("Fetching data...")

改造后

func showLoadingMessage() {
    print("Fetching data...")
}

showLoadingMessage()
// 业务逻辑
showLoadingMessage()

2. 扩展(Extensions)

日期格式化改造前

let formatter = DateFormatter()
formatter.dateStyle = .medium
let dateString = formatter.string(from: Date())

改造后

extension Date {
    /// 格式化为本地化中等样式,如"2025年6月5日"
    func formattedMedium() -> String {
        self.formatted(.dateTime.year().month().day())
    }
}

// 使用:
let dateString = Date().formattedMedium()

3. 计算属性

年龄判断改造前

struct User { let age: Int }

if user.age > 18 { /* 成人逻辑 */ }
guard user.age > 18 else { return }

改造后

struct User {
    let age: Int
    var isAdult: Bool { age > 18 }
}

if user.isAdult { /* 成人逻辑 */ }
guard user.isAdult else { return }

4. 泛型(Generics)

数组打印改造前

func printIntArray(_ array: [Int]) {
    array.forEach { print($0) }
}

func printStringArray(_ array: [String]) {
    array.forEach { print($0) }
}

改造后

func printArray<T>(_ array: [T]) {
    array.forEach { print($0) }
}

printArray([1, 2, 3])     // 打印Int
printArray(["a", "b", "c"]) // 打印String

5. 协议扩展

日志功能改造前

class UserViewModel {
    func log() { print("UserViewModel log") }
}

class ProductViewModel {
    func log() { print("ProductViewModel log") }
}

改造后

protocol Loggable {
    func log()
}

extension Loggable {
    func log() {
        print("(Self.self) log")
    }
}

class UserViewModel: Loggable {}
class ProductViewModel: Loggable {}

userVM.log() // 输出:UserViewModel log

何时应该避免DRY?

DRY也有适用边界:

  1. 如果合并代码会降低可读性
  2. 当相似逻辑可能独立变化时
  3. 少量重复优于过度设计

总结

工具 适用场景 示例收益
函数封装 重复代码段 集中修改点
扩展 添加通用功能 日期格式化复用
计算属性 频繁使用的属性判断 业务规则集中管理
泛型 类型无关的通用操作 统一容器处理逻辑
协议扩展 多类型共享默认实现 减少样板代码

核心原则
✅ 识别重复模式后抽象
✅ 优先使用Swift类型系统
✅ 在简洁性和灵活性间平衡

通过合理运用这些技巧,可以使代码库更健壮、更易维护,同时提升开发效率。记住,DRY不是教条,而是服务于代码质量的工具。

昨天 — 2025年6月8日首页

学习React的一些知识

作者 unravel2025
2025年6月7日 22:39

目前前端大部分公司应该都在使用React。这里记录一些学习React所需要的资料,方便自己查阅,也方便别人省去找资料的时间

  1. React官网,提供学习的最权威资料。不管是入门还是深入学习都很有用

react.dev/

  1. React中文官网

zh-hans.react.dev/

  1. CSS 样式和选择器学习

developer.mozilla.org/zh-CN/docs/…

  1. html的所有标签,介绍和学习

developer.mozilla.org/zh-CN/docs/…

  1. less,增强的css配置

less.bootcss.com/#%E6%A6%82%…

  1. redux状态管理

cn.redux.js.org/

  1. redux-toolkit 在redux基础上封装的,更易于使用的框架

redux-toolkit.js.org/

  1. react技术解密,带你了解react的一些实现原理

react.iamkasong.com/

❌
❌