我从Apple那里浏览了iBook,找不到任何定义:
有人可以解释结构dispatch_after吗?
dispatch_after(<#when: dispatch_time_t#>, <#queue: dispatch_queue_t?#>, <#block: dispatch_block_t?#>)
我创建了一个包含UIActivityIndicator的UIAlertView.一切都很好,但我也希望UIAlertView在5秒后消失.
如何在5秒后解除我的UIAlertView?
 var alert: UIAlertView = UIAlertView(title: "Loading", message: "Please wait...", delegate: nil, cancelButtonTitle: "Cancel");
 var loadingIndicator: UIActivityIndicatorView = UIActivityIndicatorView(frame: CGRectMake(50, 10, 37, 37)) as UIActivityIndicatorView
 loadingIndicator.center = self.view.center;
 loadingIndicator.hidesWhenStopped = true
 loadingIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray
 loadingIndicator.startAnimating();
 alert.setValue(loadingIndicator, forKey: "accessoryView")
 loadingIndicator.startAnimating()
 alert.show()
基本上我正在尝试实现一个动画,它将在返回原始文本之前将标签的文本替换几秒钟.我已经设法让标签在3秒后更改文本并淡出,但是我无法弄清楚如何在动画完成后将文本返回到原始状态.
这是我目前拥有的:
    @IBAction func fade() {
    userMessageLabel.alpha = 100
    UIView.beginAnimations(nil, context: nil)
    UIView.setAnimationDuration(3)
    userMessageLabel.text = "Name is not valid!"
    userMessageLabel.alpha = 0
    UIView.commitAnimations()
}
我需要文字标签返回"请输入你的名字"
任何帮助将非常感激.
我可以通过两种方式延迟某些时间(也许还有更多方法):
   func delay(delay:Double, closure: @escaping ()->()) {
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: closure)
    }
   //way 1:
    delay(delay: 1.0, closure: {
    })
   //way 2:
    _ = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false){ _ in 
    }
这些方式之间有什么区别吗?方法1比方法2好吗?我只想添加1秒的延迟,应该使用哪种方式?
我有一个 UIControl,它会在 0.5 秒后调用一个函数,具体取决于用户按下它的次数。(例如,按 1 次调用 f1(),按 2 次调用 f2(),按 3 次调用 f3())
所以基本上我需要在用户按下 Control 时设置一个计时器。如果 0.5 秒内未按下 Control,则创建一个对话框。我尝试过使用 DispatchQueue,但是当它到达创建对话框时,需要几秒钟的时间。我认为这是因为它是同时调用的,而不是在主线程上调用的(如果术语不好,请原谅)。
self.operationQueue.cancelAllOperations() //To cancel previous queues
self.mainAsyncQueue = DispatchQueue(label: "bubblePressed" + String(describing: DispatchTime.now()), qos: DispatchQoS.default, attributes: DispatchQueue.Attributes.concurrent)
let time = DispatchTime.now()
self.currentTime = time
self.mainAsyncQueue!.asyncAfter(deadline: time + 0.5){
  guard self.currentTime == time else {
    return
  }
  let tempOperation = BlockOperation(block:{
    self.displayDialog()
  })
  self.operationQueue.addOperation(tempOperation)
}
operationQueue并被mainAsycQueue定义viewDidLoad为
self.currentTime = DispatchTime.now()
self.operationQueue = OperationQueue()
如何displayDialog()在主线程中调用我的函数以使其加载速度更快?
我知道我可以使用followign语法(如何编写Swift 3中的延迟)来延迟Swift 3中的部分代码:
let when = DispatchTime.now() + 2 // change 2 to desired second delay.
DispatchQueue.main.after(when: when) {
// run your code with delay
}
或者类似的帖子:如何在Swift 3中创建调度队列
然而,这些不是我可以使用的延迟方法.我需要在循环中插入一个延迟.例如,假设有一个标签组件和一个按钮.当我单击按钮时,我希望标签连续显示循环变量:
@IBOutlet weak var showIntegers: UILabel!
@IBAction func countNums(_ sender: AnyObject) {
    for i in 1...5 {
        showIntegers.text = String(i)
        //delay code here, sleep(1) doesn't work
    }
}
我使用睡眠作为延迟但是然后应用程序睡眠5秒然后显示5.我连续1秒钟看不到1,2,3,4和5.
我也弄清楚如何在循环中使用DispatchQueue类.感谢您的帮助.
我正在尝试编写一个小程序,该程序循环运行并每 30 秒执行一些代码。
我不太关心它的时间是否准确,但我确实关心该程序可以在 Linux 平台上编译和运行,并且可以使用 swift 包管理器来构建和测试它。
我的第一枪就像
while true {
    print("doing the work")
    sleep(30) // also tried usleep(30*1000*1000)
}
显然,我在 swift 4 中没有sleep(_:)找到任何引用,并且该代码无法编译。我尝试使用 a Timer,但是一旦计时器开始计时,程序就会退出,因为计时器在后台运行,而主线程的唯一工作就是安排它。
这一定比看起来更容易。关于 Swift 中的线程管理,我缺少什么可以解释我发现这个有多难?
--- 编辑为了澄清为什么这与众多建议的重复项不同:
我明确地尝试让主线程休眠,正如我上面提到的,我无法使用sleep其他地方接受的答案建议的函数在 Linux 上使用 Swift 进行编译。我的程序在 CLI 上下文中的上下文意味着后台线程中的延迟操作(正如许多其他可用来源所建议的那样)在这里不起作用。此外,此 CLI 在 Linux 上运行,因此我不能依赖仅限 iOS 的库。