Как выполнить последовательную запись файла в отдельном потоке - PullRequest
0 голосов
/ 13 августа 2010

Мне даны некоторые данные в функции обратного вызова для последовательной записи на диск, около 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:, потому что не могу получить доступ к экземпляру.Должен ли я сделать мой член данных статическим?Есть ли лучшее решение?

1 Ответ

2 голосов
/ 13 августа 2010

Если вы не беспокоитесь о поддержке ранее, чем iOS 4.0, посмотрите на Grand Central Dispatch. Вы можете сделать блок или указатель на функцию встроенными в контекст, захваченный в нем. Затем вы создаете новую очередь с GCD, и она будет обрабатывать все потоки для вас. Просто сделайте свой блок-вызов как хотите, как только закончите.

Все блоки запоминают контекст, из которого они созданы. Лучшие примеры использования GCD можно найти в разделе основной ОС видео WWDC.

Это метод, который я использую для выполнения почти всех потоковых работ в эти дни.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...