连续运行一个线程而不会在swift中阻塞主线程

时间:2017-01-20 03:25:27

标签: swift multithreading macos

我写了一段代码,我需要不断地运行它。最初我使用RunLoop.current.run()。它工作正常。问题是它阻塞了主线程。如何在不阻塞的情况下连续在后台运行它。

基础课程结构

class Keylogger
{
    func start()
    {
        let observer = UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque())

        /* Connected and Disconnected Call Backs */
        IOHIDManagerRegisterDeviceMatchingCallback(manager, Handle_DeviceMatchingCallback, observer)

        IOHIDManagerRegisterDeviceRemovalCallback(manager, Handle_DeviceRemovalCallback, observer)
        /* Input value Call Backs */
        IOHIDManagerRegisterInputValueCallback(manager, Handle_IOHIDInputValueCallback, observer);
        /* schedule */
        IOHIDManagerScheduleWithRunLoop(manager, CFRunLoopGetMain(), CFRunLoopMode.defaultMode.rawValue)
        print("Started")
    }
}

在main.swift中

var logger = Keylogger()
logger.start()
RunLoop.current.run()
// Whatever written below this will not be executed obviously

我之前使用DispatchQueue作为后台任务(这只是一段代码)但是如何连续执行它?

我试过了

var d = Keylogger()
var ff = {
    d.start()
}

var f = DispatchQueue(label: "Keylogger", qos: .userInteractive, attributes: .concurrent)
f.async(execute: ff)



while true
{}

start()的{​​{1}}永远不会执行。

我想到了创建可执行文件并通过Keylogger运行可执行文件。除此之外有什么方法可以做到吗?

1 个答案:

答案 0 :(得分:2)

我认为你不理解RunLoop.current.run()的目的。

您的代码仅在程序运行时有效。不断。

您的键盘记录程序代码在另一个线程上运行。因此,为了保持该线程的活动,主线程必须是活动的。这就是RunLoop.current.run()的原因。

因此,尝试使用回调(如keylogger正在使用)并在另一个线程上安排它。或者,执行您想要的所有操作,并将RunLoop.current.run()放在代码的最后。