需要CFRunLoopRun()但希望它解锁

时间:2015-08-01 19:27:28

标签: objective-c cocoa cfrunloop

我在OSX的cocoa应用程序中有以下代码:

void *callbackInfo = NULL; // could put stream-specific data here.
            FSEventStreamRef stream;
            CFAbsoluteTime latency = 1.0; /* Latency in seconds */

            /* Create the stream, passing in a callback */
            stream = FSEventStreamCreate(NULL,
                                         &mycallback,
                                         callbackInfo,
                                         pathsToWatch,
                                         kFSEventStreamEventIdSinceNow, /* Or a previous event ID */
                                         latency,
                                         kFSEventStreamCreateFlagFileEvents//kFSEventStreamCreateFlagNone /* Flags explained in reference */
                                         );

            /* Create the stream before calling this. */
            FSEventStreamScheduleWithRunLoop(stream, CFRunLoopGetCurrent(),kCFRunLoopDefaultMode);
            FSEventStreamStart(stream);



            CFRunLoopRun();

        }

此代码会收到有关文件系统更改的通知并做出相应的反应(回调函数不在代码段中)。

我现在的问题是CFRunLoopRun()是阻塞的。即进一步执行代码停止。但是,我正在寻找一种可能性,我可以开始观察文件系统更改,但也可以再次停止它(例如从另一个对象)。

我想到的一个选项是仅启动循环一秒钟,然后检查全局变量。但是,我通常不喜欢全局变量......

这里有人有一个很好的方便的想法,如何解决这个问题?购买开销并将执行放入一个单独的线程是不是一个好主意?

提前致谢! 诺贝特

2 个答案:

答案 0 :(得分:1)

CFRunLoopRun()永远运行当前的运行循环,直到在runloop中注册的人调用CFRunLoopStop()。除非你做的事非常花哨,否则这不是你想做的事。

如果要运行FSEventStream回调,只需将其注册到runloop并保留,之后就不必对runloop进行任何明确的操作,将偶数流注册为源是你所要做的一切。

如果您想停止观察流,请在其上调用FSEventStreamStop()

答案 1 :(得分:0)

Cocoa应用程序具有隐式运行循环,因此只需删除CFRunLoopRun();

考虑通过Grand Central Dispatch(GCD)使用调度队列,而不是在运行循环上安排流