我希望AppDelegate在可能的情况下执行选择器,这是我的代码:
func RunLoopSourceScheduleRoutine(info:UnsafeMutableRawPointer?,r1:CFRunLoop?,mode:CFRunLoopMode?)->Void{
let obj : RunLoopSource = Unmanaged<RunLoopSource>.fromOpaque(info!).takeUnretainedValue()
let theContext = RunLoopContext.init(initWithSource: obj, andLoop: r1!)
let del = UIApplication.shared.delegate
del.performSelector(onMainThread: #selector(removeSource), with: theContext, waitUntilDone: false)
}
我试过这个:(应用程序崩溃了)
AppDelegate.performSelector(onMainThread: #selector(removeSource), with: theContext, waitUntilDone: false)
如何从全局函数在主线程上执行选择器?
答案 0 :(得分:1)
performSelectorOnMainThread:withObject:waitUntilDone:
使用常见的运行循环模式对消息进行排队。根据Apple的&#34;并发编程指南&#34;,主队列将把排队的任务与来自应用程序运行循环的其他事件交错。因此,如果事件队列中还有其他要处理的事件,则可以先运行调度队列中的排队块,即使它们是稍后提交的。
要解决此问题,您可以按如下方式使用dispatchQueue:
DispatchQueue.main.async {
UIApplication.shared.delegate.removeSource()
}
您可以在以下链接中详细了解此信息: https://blackpixel.com/writing/2013/11/performselectoronmainthread-vs-dispatch-async.html
答案 1 :(得分:0)
请在swift 4中按照以下方式进行操作:
performSelector(onMainThread: #selector(self.removeSource), with: nil, waitUntilDone: false)
@objc func removeSource() {
print("removeSource")
}
答案 2 :(得分:0)
您可以将DispatchQueue.main.sync
的内容包含在DispatchQueue.main.async
或class func removeSource() {
DispatchQueue.main.sync {
// Your code
}
}
AppDelegate.removeSource()
编辑,然后您可以调用此函数{{1}}