FSEventStream の基本を機能させることに成功し、新しいファイル イベントのフォルダーを監視できるようになりました。残念ながら、私が FSEventStreamCreate() に渡しているコールバック参照が失われている/破損している/保持されていないため、必要なデータ オブジェクトにもアクセスできません。キーコードブロックは次のとおりです。
FileWatcher.m : (FSEvent ストリームのセットアップ)
FSEventStreamContext context;
//context.info = (__bridge_retained void *)(uploadQueue); // this didn't help
context.info = CFBridgingRetain(uploadQueue);
context.version = 0;
context.retain = NULL;
context.release = NULL;
context.copyDescription = NULL;
/* Create the stream, passing in a callback */
stream = FSEventStreamCreate(NULL,
&FileWatcherCallback,
&context,
pathsToWatch,
kFSEventStreamEventIdSinceNow, /* Or a previous event ID */
latency,
kFSEventStreamCreateFlagFileEvents /* Also add kFSEventStreamCreateFlagIgnoreSelf if lots of recursive callbacks */
);
Filewatcher.m: FileWatcherCallback
void FileWatcherCallback(
ConstFSEventStreamRef streamRef,
FSEventStreamContext *clientCallBackInfo,
size_t numEvents,
void *eventPaths,
const FSEventStreamEventFlags eventFlags[],
const FSEventStreamEventId eventIds[])
{
int i;
char **paths = eventPaths;
// Retrieve pointer to the download Queue!
NSMutableDictionary *queue = (NSMutableDictionary *)CFBridgingRelease(clientCallBackInfo->info);
// Try adding to the queue
[queue setValue:@"ToDownload" forKey:@"donkeytest" ];
...
}
このコールバック関数が起動されると、ファイル パスを正常に取得できますが、NSMutableDictionary への clientCallBackInfo->info ポインターは、ストリームをセットアップしたときとは異なるメモリ アドレスを指しています。次に辞書に追加しようとすると、例外がスローされます (setValue 行)。
何らかの方法でポインターを別の方法で処理する必要がありますか? どんな助けでも大歓迎です。(私は、ARCを含むデフォルトのビルド設定でXcode 4.5.1を使用しています。)