如何在全局函数中使用AppDelegate在主线程上执行选择器,在swift中?

时间:2018-02-06 11:52:53

标签: ios swift multithreading pointers

我希望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)

如何从全局函数在主线程上执行选择器?

3 个答案:

答案 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.asyncclass func removeSource() { DispatchQueue.main.sync { // Your code } }

中,而不是使用选择器
AppDelegate.removeSource()

编辑,然后您可以调用此函数{{1}}