小编Wil*_*ler的帖子

如何使用 @MainActor 初始化全局变量?

我想要某种使用 同步的全局变量@MainActor

这是一个示例结构:

@MainActor
struct Foo {}
Run Code Online (Sandbox Code Playgroud)

我想要一个像这样的全局变量:

let foo = Foo()
Run Code Online (Sandbox Code Playgroud)

但是,这不会编译并出现错误Call to main actor-isolated initializer 'init()' in a synchronous nonisolated context

很公平。我尝试在主线程上构建它,如下所示:

let foo = Foo()
Run Code Online (Sandbox Code Playgroud)

这可以编译!但是,它会崩溃EXC_BAD_INSTRUCTION,因为DispatchQueue.main.sync无法在主线程上运行。

我还尝试创建一个包装函数,例如:

let foo = DispatchQueue.main.sync {
    Foo()
}
Run Code Online (Sandbox Code Playgroud)

并使用

let foo = syncMain {
    Foo()
}
Run Code Online (Sandbox Code Playgroud)

但编译器无法识别if Thread.isMainThread并再次抛出相同的错误消息Call to main actor-isolated initializer 'init()' in a synchronous nonisolated context

这样做的正确方法是什么?我需要某种可以在应用程序启动之前初始化的全局变量。

swift swift-concurrency

20
推荐指数
1
解决办法
1万
查看次数

在 SwiftUI 中,如何执行手势但将手势转发到其后面的视图?

我正在创建一个工具提示系统。

如果用户触摸工具提示之外的任何位置,我想关闭工具提示。

我希望这样在工具提示之外的触摸既可以消除工具提示,又可以激活用户点击的任何控件。(因此,您可以打开一个工具提示,然后仍然单击工具提示外部的按钮,并在第一次点击时激活它。)

为此,我有一个不可见的视图来处理点击手势并消除工具提示,但我不知道如何使 SwiftUI 不拦截并取消点击手势。在网络上,这相当于在 UIKit 中event.stopPropagation()不调用andevent.preventDefault()调用 super intouchesBegan:

有任何想法吗?

ios swift swiftui

9
推荐指数
2
解决办法
7879
查看次数

在CMTime和AVFoundation中通过单帧移动

我正在尝试用AVFoundation播放视频.我使用以下代码获得一个按钮,使播放前进一帧.

它间歇性地工作,在一些执行中它会做正确的事情并前进一帧,但是大多数时候我将不得不按下按钮3或4次才能前进一帧.

这让我觉得这是一种精确的问题,但我无法弄清楚它是什么.每次运行时,新的CMTime似乎都以相同的数量前进.

我的另一个理论是它可能是由于currentTime没有被设置为我的帧速率的精确帧边界(由搜索视频引起).但我不知道如何以我的帧率"捕捉"到最近的帧.

AVAssetTrack *videoTrack = ...;
Float64 frameRate = [videoTrack nominalFrameRate];

CMTime currentTime = [self.playerItem currentTime];
CMTime oneFrame = CMTimeMakeWithSeconds(1.0 / frameRate, currentTime.timescale);
CMTime added = CMTimeAdd(currentTime, oneFrame);

[self.player seekToTime:added toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

avfoundation ios cmtime

6
推荐指数
2
解决办法
4727
查看次数

标签 统计

ios ×2

swift ×2

avfoundation ×1

cmtime ×1

swift-concurrency ×1

swiftui ×1