我的工作是看使用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