Мне даны некоторые данные в функции обратного вызова для последовательной записи на диск, около 4 КБ каждые 0,02 секунды.Если я fwrite()
из потока, в котором находится функция обратного вызова, я получаю некоторое отставание в других частях кода в том же потоке.Поэтому, чтобы не блокировать этот поток во время записи на диск, я хочу переместить код fwrite в другой поток.Проблема в том, что функция обратного вызова не имеет области видимости экземпляра, поэтому я ограничен вызовом статических функций или методов класса.Данные, которые я хочу записать, принадлежат экземпляру.
Какой выбор у меня есть?Я пытался NSOperationQueue с блоками:
void (^ioBlock)(void) = ^{
fwrite(saveBuffer, length * 4, 1, file);
};
FileSaveOperation *op = [[FileSaveOperation alloc] initWithBlock:ioBlock];
[opQueue addOperation:op];
[op release];
В FileSaveOperation я настроил пул:
- (void)main
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[NSRunLoop currentRunLoop];
block();
[pool release];
}
Но это дает мне эту ошибку:
_NSAutoreleaseNoPool (): Объект 0x33ad20 класса __NSFastEnumerationEnumerator автоматически выпущен без пула на месте - просто утечка
Я не могу использовать performSelector:onThread:
, потому что не могу получить доступ к экземпляру.Должен ли я сделать мой член данных статическим?Есть ли лучшее решение?