在我的应用中,我设置了一个NSFileHandle
来(尝试)更新时读取文件。但是,我第一次修改文件时只收到一个通知。从waitForDataInBackgroundAndNotify
的子类调用NSApplication
,因此有一个活动的runloop。我认为唯一可能影响此问题的问题是,编写文件的过程使用NSDictionary
writeToFile
和atomically:true
。这是一个问题吗?
我错过了别的什么吗?
FWIW,我可以用runloop中的计时器替换通知,然后以这种方式读取文件。有点挫败了回调的目的......
设置fileHandle
- (void)setupRead:(id)sender
{
self.fileHandle = [NSFileHandle fileHandleForReadingAtPath:@"/path/to/some/file.xml"];
if( self.fileHandle == nil )
{
[self.taskLabel setStringValue:@"Error:"];
[self.taskText setStringValue:@"Unable to connect to status file"];
return;
}
// register for notifications
[self.fileHandle waitForDataInBackgroundAndNotify];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(readData:) name:NSFileHandleDataAvailableNotification object:nil];
}
读取回调
- (void)readData:(NSNotification*)note
{
NSData* msg = [self.fileHandle availableData];
if( [msg length] )
{
NSError* error = nil;
NSDictionary* statusDictionary = [NSPropertyListSerialization propertyListWithData:msg options:NSPropertyListImmutable format:nil error:&error];
[self displayStatus:statusDictionary];
}
[self.fileHandle waitForDataInBackgroundAndNotify];
}