我从Apple那里浏览了iBook,找不到任何定义:
有人可以解释结构dispatch_after吗?
dispatch_after(<#when: dispatch_time_t#>, <#queue: dispatch_queue_t?#>, <#block: dispatch_block_t?#>)
Run Code Online (Sandbox Code Playgroud) 我试过了
var timer = NSTimer()
timer(timeInterval: 0.01, target: self, selector: update, userInfo: nil, repeats: false)
Run Code Online (Sandbox Code Playgroud)
但是,我说错了
'(timeInterval: $T1, target: ViewController, selector: () -> (), userInfo: NilType, repeats: Bool) -> $T6' is not identical to 'NSTimer'
Run Code Online (Sandbox Code Playgroud) 我制作了一个垂直文本视图,用于蒙古语.它是一个自定义文本视图,由三层视图组成:子UITextView视图,容器视图(旋转90度并翻转)以保存UITextView和父视图.(有关更多背景信息,请参阅此处和此处.)
只要介于最小和最大大小之间,视图就会根据基础文本视图的内容大小增加其大小.但是,在过去的几天里,我一直在努力修复一个错误,即添加了一个额外的空间并且内容向左移动(这将在底层文本视图的坐标上).这可以在下图中观察到.黄色视图是自定义文本视图(inputWindow在下面的视图控制器代码中调用.)
点击输入几次以增加内容视图的大小后,会添加一个额外的空格.试图滚动视图什么也没做.(在宽度达到最大值并且内容大小大于帧大小之后滚动会起作用.)就好像内容在它被放置到正确位置之前被冻结到位时处于滚动的中间位置.如果我插入另一个字符(如空格),则内容视图会将其自身更新到正确的位置.
我需要改变什么?或者,如何手动强制底层UITextView显示其内容视图在正确的位置?
我试图删除所有无关的代码,只留下View Controller和Custom Vertical TextView的相关部分.如果还有其他我应该包括的内容,请告诉我.
查看控制器
视图控制器在内容视图大小更改时更新自定义文本视图的大小约束.
import UIKit
class TempViewController: UIViewController, KeyboardDelegate {
let minimumInputWindowSize = CGSize(width: 80, height: 150)
let inputWindowSizeIncrement: CGFloat = 50
// MARK:- Outlets
@IBOutlet weak var inputWindow: UIVerticalTextView!
@IBOutlet weak var topContainerView: UIView!
@IBOutlet weak var keyboardContainer: KeyboardController!
@IBOutlet weak var inputWindowHeightConstraint: NSLayoutConstraint!
@IBOutlet weak var inputWindowWidthConstraint: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
// get rid …Run Code Online (Sandbox Code Playgroud) 说我有这个循环:
count = 0
for i in 0...9 {
count += 1
}
Run Code Online (Sandbox Code Playgroud)
我想推迟它。
延时功能:
// Delay function
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)
}
Run Code Online (Sandbox Code Playgroud)
.
这意味着如果我想count每秒增加1,我会这样做:
count = 0
for i in 0...9 {
delay(1) {
count += 1
}
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为它只会延迟括号中的代码。如何延迟实际循环?我希望延迟停止迭代,直到时间过去,然后循环/代码可以再次重复。
我正在尝试编写一个小程序,该程序循环运行并每 30 秒执行一些代码。
我不太关心它的时间是否准确,但我确实关心该程序可以在 Linux 平台上编译和运行,并且可以使用 swift 包管理器来构建和测试它。
我的第一枪就像
while true {
print("doing the work")
sleep(30) // also tried usleep(30*1000*1000)
}
Run Code Online (Sandbox Code Playgroud)
显然,我在 swift 4 中没有sleep(_:)找到任何引用,并且该代码无法编译。我尝试使用 a Timer,但是一旦计时器开始计时,程序就会退出,因为计时器在后台运行,而主线程的唯一工作就是安排它。
这一定比看起来更容易。关于 Swift 中的线程管理,我缺少什么可以解释我发现这个有多难?
--- 编辑为了澄清为什么这与众多建议的重复项不同:
我明确地尝试让主线程休眠,正如我上面提到的,我无法使用sleep其他地方接受的答案建议的函数在 Linux 上使用 Swift 进行编译。我的程序在 CLI 上下文中的上下文意味着后台线程中的延迟操作(正如许多其他可用来源所建议的那样)在这里不起作用。此外,此 CLI 在 Linux 上运行,因此我不能依赖仅限 iOS 的库。