You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在App首次启动时向Realm添加初始Queue实例且仅执行一次?

实现App首次启动创建默认Queue实例的方案

当然可以实现!核心思路就是通过标记首次启动状态,确保初始化操作只执行一次。下面给你详细说怎么弄:

一、选对代码位置

根据你的项目架构,选以下其中一个位置就行:

  • 传统UIKit项目:放在AppDelegate的application(_:didFinishLaunchingWithOptions:)方法里
  • 多场景UIKit项目:放在SceneDelegate的scene(_:willConnectTo:options:)方法里
  • SwiftUI项目:放在App结构体的初始化方法里

这些位置都是App启动时最早执行的代码块,适合做初始化操作。

二、具体实现步骤

我们用UserDefaults来存储"是否已经创建过默认队列"的标记,因为它轻量、持久化,而且操作简单。

1. UIKit(AppDelegate)示例代码

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // 先初始化Realm(如果项目里还没做的话)
    do {
        _ = try Realm()
    } catch {
        print("Realm初始化失败: \(error)")
    }
    
    // 检查标记:如果已经创建过,直接跳过
    let defaults = UserDefaults.standard
    guard !defaults.bool(forKey: "hasCreatedDefaultQueues") else {
        return true
    }
    
    // 创建并保存默认队列
    do {
        let realm = try Realm()
        try realm.write {
            // 这里可以自定义3-5个队列标题,保证唯一(因为title是primaryKey)
            let defaultTitles = ["工作任务", "生活待办", "学习计划", "健身目标"]
            for title in defaultTitles {
                let queue = Queue()
                queue.title = title
                realm.add(queue)
            }
        }
        // 标记为已完成,下次启动不再执行
        defaults.set(true, forKey: "hasCreatedDefaultQueues")
    } catch {
        print("创建默认队列失败: \(error)")
    }
    
    return true
}

2. SwiftUI(App结构体)示例代码

@main
struct YourAppName: App {
    init() {
        setupDefaultQueues()
    }
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
    
    private func setupDefaultQueues() {
        let defaults = UserDefaults.standard
        guard !defaults.bool(forKey: "hasCreatedDefaultQueues") else {
            return
        }
        
        do {
            let realm = try Realm()
            try realm.write {
                let defaultTitles = ["工作任务", "生活待办", "学习计划"]
                for title in defaultTitles {
                    let queue = Queue()
                    queue.title = title
                    realm.add(queue)
                }
            }
            defaults.set(true, forKey: "hasCreatedDefaultQueues")
        } catch {
            print("初始化默认队列出错: \(error)")
        }
    }
}

三、进阶小技巧:支持后续更新默认队列

如果以后你想修改默认队列的数量或标题,直接改代码的话,老用户因为已经有标记了,不会执行新的初始化。这时候可以用版本号来处理:

private func setupDefaultQueues() {
    let defaults = UserDefaults.standard
    let currentVersion = 2 // 每次更新默认队列时,把这个数字加1
    let savedVersion = defaults.integer(forKey: "defaultQueuesVersion")
    
    // 如果保存的版本低于当前版本,才执行更新
    guard savedVersion < currentVersion else {
        return
    }
    
    do {
        let realm = try Realm()
        try realm.write {
            // 可选:删除旧的默认队列(根据你的需求决定)
            // realm.delete(realm.objects(Queue.self).filter("title IN %@", ["旧队列标题1", "旧队列标题2"]))
            
            // 添加新的默认队列
            let newDefaultTitles = ["工作任务", "生活待办", "学习计划", "阅读清单"]
            for title in newDefaultTitles {
                // 先检查是否已存在,避免重复创建
                if realm.object(ofType: Queue.self, forPrimaryKey: title) == nil {
                    let queue = Queue()
                    queue.title = title
                    realm.add(queue)
                }
            }
        }
        // 更新版本号标记
        defaults.set(currentVersion, forKey: "defaultQueuesVersion")
    } catch {
        print("更新默认队列出错: \(error)")
    }
}

注意事项

  • 因为你的Queue类把title设为了primaryKey,所以一定要确保默认标题是唯一的,否则Realm会抛出错误。
  • 确保Realm已经正确配置,比如在项目里已经导入Realm框架,并且没有自定义Realm配置的冲突。

内容的提问来源于stack exchange,提问作者hoan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:21:23