我的工作是看使用fileevent API文件夹的桌面应用程序,所以基本上这是我的代码:混合的Objective-C与C和代码组织
#import "PNAppDelegate.h"
void callback(
ConstFSEventStreamRef streamRef,
void *clientCallBackInfo,
size_t numEvents,
void *eventPaths,
const FSEventStreamEventFlags eventFlags[],
const FSEventStreamEventId eventIds[])
{
[(__bridge PNAppDelegate *)clientCallBackInfo reloadStatus];
};
@implementation PNAppDelegate
@synthesize window = _window;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSArray *pathsToWatch = [NSArray arrayWithObject: @"/Users/romainpouclet/Projects/foo"];
void *appPointer = (__bridge void *)self;
FSEventStreamContext context = {0, appPointer, NULL, NULL, NULL};
FSEventStreamRef stream;
CFAbsoluteTime latency = 3.0;
stream = FSEventStreamCreate(NULL,
&callback,
&context,
(__bridge CFArrayRef) pathsToWatch,
kFSEventStreamEventIdSinceNow,
latency,
kFSEventStreamCreateFlagNone);
NSLog(@"Schedule with run loop");
FSEventStreamScheduleWithRunLoop(stream, CFRunLoopGetMain(), kCFRunLoopDefaultMode);
FSEventStreamStart(stream);
[self reloadStatus];
}
-(void)reloadStatus
{
}
@end
没问题,它的工作原理相当不错一个POC和这个一样简单,但是它感觉有点难看(可能它是,我并不是真正习惯于混合Objective-C和C)。所以这里是我的问题:
- 我应该在哪里声明我的回调?感觉有点奇怪,因为它在那里工作。
- 是否有可能有某种基于@选择器的方法而不是回调? (我觉得他们放心:D)
感谢您的时间!
您可以在自己的源文件(可选地,与其他相关的C函数分组)中实现您的回调,并使用其前向声明导入标题。但是如果回调对于这个班级来说是100%特定的,并且在其他任何地方都不需要,那么这是没有意义的。 – 2012-07-18 20:53:34
另外,在你的情况下,回调的主体需要访问类声明和至少一种方法。 – 2012-07-18 20:54:12
感谢您的回答:) – 2012-07-19 18:30:26