Доступ к функции делегата приложения в обратном вызове FSEvent

Я создал эту функцию в файле делегата приложения. Я хочу вызвать функцию делегата приложения в обратном вызове.

Есть ли способ, пожалуйста, предложите.

-(void) monitor{
    FSEventStreamRef stream = FSEventStreamCreate(NULL, 
                                                  &feCallback,
                                                  &cntxt, 
                                                  pathsToWatch, 
                                                  kFSEventStreamEventIdSinceNow, 
                                                  1,
                                                  kFSEventStreamCreateFlagWatchRoot );
} 

static void feCallback(ConstFSEventStreamRef streamRef,
                       void* pClientCallBackInfo,
                       size_t numEvents,
                       void* pEventPaths,
                       const FSEventStreamEventFlags eventFlags[],
                       const FSEventStreamEventId eventIds[]) 
{
    NSLog(@"The file changed!"); 
    // need to to call app delegate function
}

person Yatendra    schedule 29.01.2021    source источник
comment
нет я новичок в этом   -  person Yatendra    schedule 29.01.2021
comment
мне нужны обе вещи   -  person Yatendra    schedule 29.01.2021
comment
Я знаю, как сделать объект appdelegate. мой вопрос в том, как я могу получить доступ к функциям в своем обратном вызове, как я уже упоминал в вопросе   -  person Yatendra    schedule 29.01.2021
comment
Вопрос очень широкий. Обычно FSEvents — не единственное решение проблемы. Вы могли бы добавить больше контекста к своему вопросу: какие файлы вы просматриваете? Для каких уведомлений вы ищете?   -  person mahal tertin    schedule 01.02.2021


Ответы (1)


Поскольку FSEventStreamCreate доступен только в macOS, вы можете сделать это следующим образом:

    // call this in init of your app delegate
    FSEventStreamContext  cntxt = {0, (__bridge void *)(self), NULL, NULL, NULL};
    // call FSEventStreamCreate as in your code
    // keep a reference to the stream so you can stop and start it later

Затем в вашем обратном вызове AppDelegate будет находиться в:

    YourAppDelegateClass* appDele = (__bridge YourAppDelegateClass*)pClientCallBackInfo; 

Весь механизм для FSEvents довольно сложен, нам нужно было запланировать его на правильный цикл выполнения и работать с ARC и приведением типов. Обратный вызов находится за пределами ObjectiveC, вы не сможете использовать Cocoa, а только CFString и другие типы Core Foundation. Также полезно не только прочитать документацию, но и просмотреть файл FSEvents.h в рамках Framework (контекстное меню для любой из функций, а затем перейти к определению: читать нужно больше, чем в документации). И, в зависимости от вашего дистрибутива, также работайте с песочницей App Store и закладками безопасности.

person mahal tertin    schedule 01.02.2021