NSOperation and fwrite (Iphone) - PullRequest
       8

NSOperation and fwrite (Iphone)

0 голосов
/ 11 марта 2010

У меня проблема с этим кодом. В основном я хочу выполнить fwrite из функции таймера асинхронно.

Вот кодовый блок в моей функции таймера. (Это будет вызываться таймером каждые 0,2 секунды.

-(void)timerFunction
{

       WriteFileOperation * operation =
       [WriteFileOperation writeFileWithBuffer:pFile buffer:readblePixels length:nBytes*15];
       [_queue addOperation:operation]; // Here it is waiting to complete the fwrite
}

WrtiteFilerOperation - это класс NSoperation, в который он должен записать проходящий буфер в файл. Я добавил этот код в метод «start» метода WriteFileOperation.

- (void)start

{

    if (![NSThread isMainThread])
    {
        [self performSelectorOnMainThread:@selector(start) withObject:nil waitUntilDone:NO];
        return;
    }


    [self willChangeValueForKey:@"isExecuting"];
    _isExecuting = YES;
    [self didChangeValueForKey:@"isExecuting"];

    NSLog(@"write bytes %d",fwrite(_buffer, 1, _nBytes, _file));
    free(_buffer);
    [self finish];
}

Проблема здесь в том, что моя функция timerFunction заблокирована NSOperation, пока он не запишет буфер в файл. и производительность кажется такой же, как и непосредственное размещение fwrite в timerFunction.

Я хочу просто вернуться к timerFunction без ожидания завершения выполнения метода запуска.

Что я здесь не так делаю?

Заранее спасибо

Raghu

1 Ответ

1 голос
/ 11 марта 2010

Ваша операция блокируется, потому что вы заставляете операцию запускать ее метод start в главном потоке, удаляя все преимущества использования NSOperationQueue. Вместо этого я бы рекомендовал удалить реализацию -start, которую вы видите выше, и переместить код в -main:

- (void)main
{
    NSLog(@"write bytes %d",fwrite(_buffer, 1, _nBytes, _file));
    free(_buffer);
    [self finish];
}

NSLog должен быть удален в некоторый момент, чтобы улучшить производительность. Вам также может понадобиться обернуть вышеупомянутое в NSAutoreleasePool, если вы делаете больше, чем это.

Чтобы предотвратить одновременную запись в файл несколькими потоками, вы должны установить максимальное число одновременных операций равным 1, используя код, подобный следующему:

[_queue setMaxConcurrentOperationCount:1];
...