我尝试使用performSelector实现协议/委托,但我收到此错误:
Value of type 'DoingSomething' has no member 'peformSelector'
这是我的实施:
import UIKit
protocol DoingSomethingDelegate {
// delegate function
}
class DoingSomething {
func goDoSomething()
self.performSelector(onMainThread: #selector(self.processSomething()), with: nil, waitUntilDone: true)
}
func processSomething() {
print("I'm done")
}
}
但是,如果我将函数移动到viewController,我没有错误。你们中的任何人都知道错误的原因或如何解决这个错误?
我非常感谢你的帮助。
答案 0 :(得分:1)
Per @dan评论我做了改动:
class DoingSomething:NSObject {
func goDoSomething() {
self.performSelector(onMainThread: #selector(self.processSomething), with: nil, waitUntilDone: true)
}
func processSomething() {
print("I'm done")
}
}
现在正在运作!
答案 1 :(得分:1)
正如@vandian在评论中所说,你应该考虑使用GCD。等效代码为:
DispatchQueue.main.async {
self.processSomething()
}
使用async()有几个好处。您可以在线提供代码,而无需编写单独的函数,这使得它更易于阅读和维护;您执行的闭包可以访问封闭范围,因此您可以在该代码中使用函数中的变量,例如:
func localScopeFunc {
var x: Int = 6
DispatchQueue.main.async {
//This block of code has access to the local variables from localScopeFunc
print("x = \(x)")
}
}
使用performSelector()及其变体,您只能使用零个,一个或两个参数调用函数,并且这些参数必须为NSObjects
。
强制对象成为NSObject
的子类也有一些小的缺点。这迫使编译器使用动态调度,这比Swift使用的静态调度稍慢。