我们希望在现有的SwiftUI项目中为我们的视图模型使用@MainActorAnnotation,这样我们就可以go 掉DispatchQueue.main.async.receive(on: RunLoop.main).

@MainActor
class MyViewModel: ObservableObject {
    private var counter: Int
    init(counter: Int) {
        self.counter = counter
    }
}

在从SwiftUI视图初始化带注释的类时,这很好用.但是,当使用SwiftUI预览或XCTest时,我们还需要从@MainActor上下文之外初始化类:

class MyViewModelTests: XCTestCase {

    private var myViewModel: MyViewModel!
    
    override func setUp() {
        myViewModel = MyViewModel(counter: 0)
    }

它显然不能编译:

不能从非隔离上下文中变异主执行元隔离属性‘init(count:int)’

现在,显然我们也可以按照建议的here@MainActor来注释MyViewModelTests.

但我们不希望所有的单元测试都运行在主线程上.那么,在这种情况下,推荐的做法是什么?

如果我们不想在初始化式中设置变量的值,那么同样在上面的对话中建议的用nonisolated注释init函数才能起作用.

推荐答案

只需将setUp()标记为@MainActor

class MyViewModelTests: XCTestCase {
    private var myViewModel: MyViewModel!

    @MainActor override func setUp() {
        myViewModel = MyViewModel(counter: 0)
    }
}

Ios相关问答推荐

Swift:从字符串目录获取带有参数的本地化字符串

避免从CoreData加载图像列表时出现SwiftUI挂起

在SwiftUI中为圆角矩形创建均匀分布的点轮廓

如何在Android或iPhone上的原生react 中处理其他应用程序通知?

SwiftUI标题/标题文本背景 colored颜色 屏幕宽度

在 SwiftUI 中以编程方式插入内嵌图像

无法从 Xcode 获取模拟器列表.请打开 Xcode 并try 直接从那里运行项目以解决剩余问题

xcode-select:找不到clang

如何在 SwiftUI 的 TabView 中添加底部曲线?

帧过渡动画有条件地工作

在 UICollectionView 上动态设置布局导致莫名其妙的 contentOffset 变化

Xcode intellisense 彩色框中字母的含义,如 f、T、C、M、P、C、K、# 等

在设备上卸载 ios 应用程序后如何在 ios 中保留 identifierForVendor?

如何从一个特定的视图控制器中隐藏导航栏

使用 convertPoint 获取父 UIView 内的相对位置

cocoapods中~>的用法是什么

iOS7 UITextView contentsize.height 替代

以编程方式确定 iPhone 是否越狱

在 iOS 上没有显示数字键盘

未找到符号:kUTTypeImage