如何让NSFilehandle在Objective c中并发删除和写入数据
How to make NSFilehandle to delete and write data concurrently in Objective c
我写了2个方法:
WriteToLogFile
删除日志文件
为此我使用 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。
我写了2个方法:
WriteToLogFile
删除日志文件
为此我使用 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。