我有一个框架,使用 AppDelegate
detachNewThreadSelector:
来回调 NSThread
中的方法,看起来像这样:
private func bridgeSelector(selector: String?, object: String?) {
if selector != nil && responder != nil {
dispatch_async(dispatch_get_main_queue(), {
NSThread.detachNewThreadSelector(Selector(
selector!),
toTarget: self.responder!,
withObject: object
)
})
}
}
responder
是var
在 self
中分配给AppDelegate
时的框架&#39>班级被初始化了。
应用程序在调试版本中运行没有问题,但如果在发布版本中调用上面的内容,则会立即崩溃。 (当我在发布版本中关闭优化时,它也崩溃了。)
我正在使用Xcode 7 beta和Swift 2.0。 (我知道它是测试版,但它是唯一支持Swift 2的测试版。)
编辑 - 我最终使用的是闭包而不是detachNewThreadSelector:
。适用于两个版本。
答案 0 :(得分:0)
尝试在那里添加respondsToSelector:
检查。它很脏,但是那样的东西。我相信它很脏
func bridgeSelector(selector: String?, object: String?) {
if let r = responder, let sel = selector where
r.respondsToSelector(Selector(sel))
{
dispatch_async(dispatch_get_main_queue(), {
NSThread.detachNewThreadSelector(
Selector(sel),
toTarget: r,
withObject: object
)
})
}
}
答案 1 :(得分:0)
我用来替换上述解决方案的解决方案是使用Closure
。
在框架的类中,我声明了一个闭包变量:
class FrameworkClass {
public var methodOfAnotherClass: ((sender: AnyObject?) -> ())?
func asyncMethod() {
// Done with the work.
let msg = "From Russia, with love."
methodOfAnotherClass!(sender: msg)
}
}
然后在主要课程中:
class main {
func bond(objectFromRussia: AnyObject?) {
if let msg = objectFromRussia as? String {
Swift.print(msg)
}
}
func callMeMaybe() {
let aFrameworkClassObject = FrameworkClass()
aFrameworkClassObject.methodOfAnotherClass = bond
aFrameworkClassObject.asyncMethod()
}
}
调用callMeMaybe:
时,控制台应打印From Russia, with love.