如何让NSFilehandle在Objective c中并发删除和写入数据

How to make NSFilehandle to delete and write data concurrently in Objective c

我写了2个方法:

  1. WriteToLogFile

  2. 删除日志文件

为此我使用 NSFileHandle

我的代码写成:

- (void)WriteToLogFile:(NSString *)string {

 dispatch_async(logQueue ,^ {
        if (nil == fileHandle) {
            // log file not opened
            NSLog(@"LogFile not opened");
            return;
        }
        [fileHandle seekToEndOfFile];
        [fileHandle writeData:[string dataUsingEncoding:NSUTF8StringEncoding]];
      });
    }

其他函数删除为:

-(void) deleteLogDataFromFile
{
    NSString *logFilePath = [self getLogFilePath];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    if([fileManager fileExistsAtPath:logFilePath])
    {
    [[NSFileManager defaultManager] createFileAtPath:logFilePath contents:[NSData data] attributes:nil];
    fileHandle = [NSFileHandle fileHandleForWritingAtPath:logFilePath];
    }
}

现在我从一个循环中调用这 2 个方法来检查它是否在 fileHandle 尝试写入文件并发现不存在这样的文件的某个点崩溃

for (int i = 0; i<1000; i++) {
    [self WriteToLogFile:@"Hello"];
    [self DeleteLogs];
}

并且 Xcode 抛出错误 b/w 循环是 运行

Terminating app due to uncaught exception 'NSFileHandleOperationException', reason: '*** -[NSConcreteFileHandle writeData:]: Bad file descriptor'

所以我需要知道我应该如何使我的写入文件或删除文件一起工作,我知道我应该对 fileHandle 进行一些锁定。 谁能告诉我应该怎么做才能解决这个问题?

deleteLogDataFromFile 方法中的一个简单 dispatch_async(logQueue ,^ {...}); 应该可以解决问题。 (假设 logQueue 是一个串行调度队列)。

为了更加安全,请考虑在 class 中将 fileHandle 设置为 属性。然后覆盖 getter,使用

@ synchronized(_fileHandle){
    return _fileHandle
}

最后,在 WriteToLogFile 方法中使用 self.fileHandle。