我想要某种使用 同步的全局变量@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。
这样做的正确方法是什么?我需要某种可以在应用程序启动之前初始化的全局变量。
我正在创建一个工具提示系统。
如果用户触摸工具提示之外的任何位置,我想关闭工具提示。
我希望这样在工具提示之外的触摸既可以消除工具提示,又可以激活用户点击的任何控件。(因此,您可以打开一个工具提示,然后仍然单击工具提示外部的按钮,并在第一次点击时激活它。)
为此,我有一个不可见的视图来处理点击手势并消除工具提示,但我不知道如何使 SwiftUI 不拦截并取消点击手势。在网络上,这相当于在 UIKit 中event.stopPropagation()不调用andevent.preventDefault()或调用 super intouchesBegan:。
有任何想法吗?
我正在尝试用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)
谢谢你的帮助!