在Swift 2中,我能够dispatch_after使用大中央调度来延迟一个动作:
var dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC)))
dispatch_after(dispatchTime, dispatch_get_main_queue(), {
// your function here
})
Run Code Online (Sandbox Code Playgroud)
但这似乎不再在Swift 3(或4)中编译.在Swift 3中使用新的Dispatch API编写它的首选方法是什么?
在iOS 12.2上。使用UIAlertController的actionSheet Xcode时,遇到此问题的人都会遇到约束错误
相同的代码在iOS 12.1上运行,没有错误
我已经在Xcode 10.2和10.1上测试了此代码
class ViewController: UIViewController {
let Click : UIButton = {
let button = UIButton(type: UIButton.ButtonType.system)
button.translatesAutoresizingMaskIntoConstraints = false
button.setTitle("OK", for: .normal)
button.tintColor = UIColor.blue
button.addTarget(self, action: #selector(click(_:)), for: UIControl.Event.touchUpInside)
return button
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(Click)
Click.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
Click.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
}
@objc func click(_ sender: UIButton) {
let optionMenu = UIAlertController(title: nil, message: "Choose Option", preferredStyle: .actionSheet)
let deleteAction = UIAlertAction(title: "Delete", style: .default)
let saveAction = …Run Code Online (Sandbox Code Playgroud) 我最近升级到了Swift 5,Xcode版本10.2(10E125),并且在解决了正在进行的应用程序中的一些编译问题后,看到了这个新的,从未见过的请求。我无法通过直接搜索在我的项目中找到任何证据,也没有在线搜索结果。项目中的吊舱也没有任何回报。
这让我感到担心,想知道是否有人对此有任何信息。
更新2:我怀疑这个问题因为我描述的可能的解决方案而被投票。为了清楚起见,突出显示了它。
更新1:这个问题得到了很多人的关注。如果您认为可以通过您自己遇到错误的情况来增强问题,请在评论中简要描述您的情况,以便我们可以使此问答更有价值。如果您对您的问题版本有解决方案,请将其添加为答案。
Task.detached我想在使用和函数执行异步后台工作后更新 UI async。
但是,我在构建过程中收到构建错误错误Reference to captured var 'a' in concurrently-executing code。
我尝试了一些方法,在更新 UI 之前将变量转换为 alet constant是唯一有效的方法。为什么我需要先创建一个 let 常量才能更新 UI?还有其他选择吗?
class ViewModel: ObservableObject {
@Published var something: String?
init() {
Task.detached(priority: .userInitiated) {
await self.doVariousStuff()
}
}
private func doVariousStuff() async {
var a = "a"
let b = await doSomeAsyncStuff()
a.append(b)
something = a /* Not working,
Gives
- runtime warning `Publishing changes from
background threads is …Run Code Online (Sandbox Code Playgroud) 当遵守协议或重写超类方法时,您可能无法将方法更改为async,但您可能仍然想调用一些async代码。例如,当我正在重写一个根据 Swift 新的结构化并发编写的程序时,我想async通过class func setUp()覆盖XCTestCase. 我希望我的设置代码在任何测试运行之前完成,因此使用Task.detachedorasync { ... }是不合适的。
最初,我写了一个这样的解决方案:
final class MyTests: XCTestCase {
override class func setUp() {
super.setUp()
unsafeWaitFor {
try! await doSomeSetup()
}
}
}
func unsafeWaitFor(_ f: @escaping () async -> ()) {
let sema = DispatchSemaphore(value: 0)
async {
await f()
sema.signal()
}
sema.wait()
}
Run Code Online (Sandbox Code Playgroud)
这似乎运作良好。然而,在《Swift 并发:幕后花絮》中,运行时工程师 Rokhini Prabhu 指出:
信号量和条件变量等基元与 Swift 并发一起使用是不安全的。这是因为它们隐藏了 Swift 运行时的依赖信息,但在代码的执行中引入了依赖关系……这违反了线程前进的运行时契约。
她还包含了这种不安全代码模式的代码片段
func updateDatabase(_ …Run Code Online (Sandbox Code Playgroud) 更新到 Xcode 12 后,我收到了很多关于 SPM 依赖项(包括 RxSwift 和 Facebook)的警告。
iOS Simulator 部署目标“IPHONEOS_DEPLOYMENT_TARGET”设置为 8.0,但支持的部署目标版本范围为 9.0 到 14.0.99。
我可以以某种方式抑制这些警告,还是等待适当框架的创建者修复它的唯一方法?
应用程序崩溃并显示以下错误消息
2019-10-12 20:01:34.332334-0700 Awesome App[26368:3535170] [plugin] AddInstanceForFactory: No factory registered for id <CFUUID 0x600002903280> F8BB1C28-BAE8-11D6-9C31-00039315CD46
Run Code Online (Sandbox Code Playgroud)
崩溃时的断点似乎与 AVAudioPlayer 有关
let path = Bundle.main.path(forResource: "menu_background.mp3", ofType:nil)!
audioPlayer = try AwesomeAudioPlayer(contentsOf: URL(fileURLWithPath: path)) ---> breakpoint
Run Code Online (Sandbox Code Playgroud) 如何使用新的 Swift 5.5await关键字来等待一段时间?
DispatchQueue通常,对于完成处理程序,您可以通过使用's得到类似的结果asyncAfter(deadline:execute:):
func someLongTask(completion: @escaping (Int) -> Void) {
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
completion(Int.random(in: 1 ... 6))
}
}
someLongTask { diceRoll in
print(diceRoll)
}
Run Code Online (Sandbox Code Playgroud)
在 Swift 5.5 中如何将其转换为使用async& ?await
这是我之前的asyncDetached 在 MainActor call 之后回到主线程的后续。
这是 iOS 视图控制器的完整代码:
import UIKit
func test1() {
print("test1", Thread.isMainThread) // true
Task {
print("test1 task", Thread.isMainThread) // false
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
test1()
test2()
}
func test2() {
print("test2", Thread.isMainThread) // true
Task {
print("test2 task", Thread.isMainThread) // true
}
}
}
Run Code Online (Sandbox Code Playgroud)
这两个函数test1和test2是相同的,并且是从同一位置调用的。然而,其中一个operation:在后台线程上运行其任务初始值设定项函数,另一个在主线程上运行。
是什么决定了这一点?我只能认为这与声明方法的位置有关。但这与声明方法的位置有什么关系呢?
swift5 ×10
swift ×6
async-await ×3
xcode ×3
concurrency ×1
ios ×1
microphone ×1
swift4 ×1
swift5.1 ×1
swiftui ×1
uibutton ×1
xcode12 ×1
xcode13 ×1