如何在单独的线程中执行顺序文件写入

时间:2010-08-13 12:02:26

标签: iphone c objective-c multithreading callback

我在回调函数中给出了一些数据,按顺序写入磁盘,每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:,因为我无法访问该实例。我应该使我的数据成员静态吗?有更好的解决方案吗?

1 个答案:

答案 0 :(得分:2)

如果您不担心早于iOS 4.0的支持,请查看Grand Central Dispatch。您可以创建一个块或函数指针,与其中捕获的上下文内联。然后,您使用GCD创建一个新队列,它将为您处理所有线程。一旦完成,只需拨打你想要的电话。

所有块都会记住创建它们的上下文。使用GCD的最佳示例可以在WWDC视频的核心操作系统部分找到。

这是我用来完成几乎所有线程工作的方法。

相关问题