2010-03-11 47 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