2010-03-11 107 views
0

我有這個代碼的問題。基本上我想執行定時器函數異步的fwrite。NSOperation和fwrite(Iphone)

這是我的定時器功能中的代碼塊。 (這將通過定時器每隔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類。 我在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,直到它寫入緩衝區中的文件。(我的意思是封鎖,直到啓動方法完成其執行) 和表現似乎一樣直接放置在timerFunction和fwrite。

我想只是返回timerFunction而不用等待start方法執行完成。

我在做什麼錯在這裏?

在此先感謝

Raghu

回答

1

你的操作是阻止,因爲你是迫使操作主線程上運行其start方法,除去使用NSOperationQueue的任何好處。相反,我建議去掉-start實現以上你看到的,代碼移動到-main

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

的NSLog的應該在某個點被移除,以提高性能。如果你做的不止這些,你可能還需要將上述內容包裝在NSAutoreleasePool中。

[_queue setMaxConcurrentOperationCount:1]; 

爲了防止多個線程在同一時間寫入文件,你應該併發操作的最大數量使用如下代碼設置爲1