我在回调函数中给出了一些数据,按顺序写入磁盘,每0.02秒大约4KB。如果回调函数所在的线程中有fwrite()
,那么在同一个线程的代码的其他部分会出现一些延迟。因此,为了在写入磁盘时不阻塞此线程,我想将fwrite代码移动到另一个线程。问题是回调函数没有实例范围,所以我只能调用静态函数或类方法。我想写的数据属于实例。
我有什么选择?我尝试过NSOperationQueue with Blocks:
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():类__NSFastEnumerationEnumerator的对象0x33ad20自动释放,没有池到位 - 只是泄漏
我无法使用performSelector:onThread:
,因为我无法访问该实例。我应该使我的数据成员静态吗?有更好的解决方案吗?
答案 0 :(得分:2)
如果您不担心早于iOS 4.0的支持,请查看Grand Central Dispatch。您可以创建一个块或函数指针,与其中捕获的上下文内联。然后,您使用GCD创建一个新队列,它将为您处理所有线程。一旦完成,只需拨打你想要的电话。
所有块都会记住创建它们的上下文。使用GCD的最佳示例可以在WWDC视频的核心操作系统部分找到。
这是我用来完成几乎所有线程工作的方法。