@MainActor

     @MainActor 用于确保某个类或结构体的属性和方法在主线程(UI 线程)上执行。它主要用于 SwiftUI 和 UIKit 中,以确保与用户界面相关的代码在主线程上运行,从而避免出现线程安全问题。

主要特点

  1. 1、线程安全: @MainActor 确保任何被标记的代码都是在主线程上执行的,这样可以防止多线程环境中可能出现的 UI 更新问题。

  2. 2、简化异步编程: 使用 @MainActor 可以简化在异步代码中对主线程的切换,减少手动调度到主线程的需要。

  3. 3、与 async/await 配合使用: @MainActor 通常与新的 async/await 异步编程模型结合使用,以确保异步任务在主线程上执行。

使用示例

以下是如何在 SwiftUI 中使用 @MainActor 的简单示例:

import SwiftUI

@MainActor
class CounterViewModel: ObservableObject {
    @Published var count: Int = 0
    
    func increment() {
        count += 1
    }
    
    func reset() {
        count = 0
    }
}

// 创建一个视图
struct ContentView: View {
    @StateObject private var viewModel = CounterViewModel()
    
    var body: some View {
        VStack {
            Text("Count: \(viewModel.count)")
                .font(.largeTitle)
            
            Button(action: {
                Task {
                    await viewModel.increment() // 使用 async/await 调用
                }
            }) {
                Text("Increment")
            }
            
            Button(action: {
                Task {
                    await viewModel.reset() // 使用 async/await 调用
                }
            }) {
                Text("Reset")
            }
        }
        .padding()
    }
}

解析:

  1. 1、标记类: CounterViewModel 类被标记为 @MainActor,这意味着其中的方法和属性会在主线程上执行。

  2. 2、安全更新状态: 由于所有访问 count 属性的方法都在主线程中执行,因此我们可以安全地更新 UI。

  3. 3、异步调用: 在按钮的操作中,使用 Task 来调用异步方法 incrementreset,同时确保这些操作在主线程上完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值