我写了一段代码,我需要不断地运行它。最初我使用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
运行可执行文件。除此之外有什么方法可以做到吗?
答案 0 :(得分:2)
我认为你不理解RunLoop.current.run()
的目的。
您的代码仅在程序运行时有效。不断。
您的键盘记录程序代码在另一个线程上运行。因此,为了保持该线程的活动,主线程必须是活动的。这就是RunLoop.current.run()
的原因。
因此,尝试使用回调(如keylogger正在使用)并在另一个线程上安排它。或者,执行您想要的所有操作,并将RunLoop.current.run()
放在代码的最后。