我目前正在尝试使用Rust C interop来发送操作桌面通知(使用此库的修改版本(。这里的主要目标是在单独的线程上处理这些通知发送事件,如下所示:
thread::spawn(move || unsafe {
sys::sendNotification(
NSString::from_str(&title).deref(),
NSString::from_str(&message).deref(),
NSString::from_str(&uri).deref(),
NSString::from_str(&img.unwrap_or_default()).deref(),
);
});
这将允许我同时运行多个通知"处理程序"(而不是一次显示一个通知(,还将允许我的主进程在不被阻止的情况下运行。考虑到程序(web scraper(的性质,我不希望在显示通知时停止抓取。
也就是说,这种方法有些问题,因为底层的obj-c代码依赖于NSRunLoop来通过创建的NotificationCenterDelegate实例处理点击事件(例如,用户点击打开网页的操作(。据我所知(请随时核实我对obj-c不熟悉的情况(,NSRunLoops只在主线程上操作,如果在工作线程上运行,则此代码将变得毫无用处。。。在这种情况下,通知仍然会发送,但不会处理事件。
有没有一种方法比在一个单独的循环上运行我的抓取逻辑并将notif-send事件发送到主线程进行处理(可能会因我没有打开的通知而停止(更有效?
严格来说,每个线程有(或可以有(一个NSRunLoop
,而不仅仅是主线程。但GUI的东西通常需要在主线程上运行,这仍然是一种情况。
我建议您采用在单独的线程上运行刮擦的方法。对于长时间运行的工作和GUI的任何组合来说,这通常是一个好主意——它确保工作不会导致UI挂起或打嗝。