【发布时间】:2014-07-20 20:29:30
【问题描述】:
我正在尝试根据 TouchID 登录尝试的结果更改标签上的文本,但是会出现延迟。当我尝试导航到另一个视图时也会发生同样的事情,例如我的视频在此处显示https://www.youtube.com/watch?v=gQI-93u_B1A
假设我有一个开关来处理不同的登录错误可能性,在每种情况下,如果我尝试更改标签,则会出现这种延迟,如果我使用这些情况来更改字符串变量的内容并尝试分配这个变量的内容到函数末尾的标签,断点显示将变量分配给标签的行在评估登录尝试的块之前执行,这将是代码:
func requestUserAuthentication() {
var myContext:LAContext = LAContext()
var authError:NSError?
var myLocalizedRasonMessage = "Please authenticate using your fingerprint"
if (myContext.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, error:&authError)) {
myContext.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: myLocalizedRasonMessage) { success, error in
if (success) {
self.requestAuthenticationOutput = "Login successful"
}
else {
switch error.code {
case LAError.AuthenticationFailed.toRaw():
self.requestAuthenticationOutput = "Login failed"
case LAError.UserCancel.toRaw():
self.requestAuthenticationOutput = "User canceled"
case LAError.SystemCancel.toRaw():
self.requestAuthenticationOutput = "System canceled"
case LAError.UserFallback.toRaw():
self.requestAuthenticationOutput = "User pressed \"Enter Password\""
default:
self.requestAuthenticationOutput = "TouchID is not configured"
}
}
}
}
else {
switch authError!.code {
case LAError.TouchIDNotAvailable.toRaw():
self.requestAuthenticationOutput = "No Touch ID on device"
case LAError.TouchIDNotEnrolled.toRaw():
self.requestAuthenticationOutput = "No fingers enrolled"
case LAError.PasscodeNotSet.toRaw():
self.requestAuthenticationOutput = "No passcode set"
default:
self.requestAuthenticationOutput = "Something went wrong getting local auth"
}
}
self.statusLabel.text = self.requestAuthenticationOutput
}
在案例中作为输出结果的唯一方式立即执行的是警报。 我是 iOS 编程新手,但我怀疑它与异步代码执行有关,但我并不完全了解如何使用 GCD/queues/etc。如何让函数中的最后一行等待第一部分完成执行?任何想法将不胜感激。 (我用的是swift,但是测试ObjC得到了同样的结果)
【问题讨论】:
标签: ios concurrency swift