NSDocument presentedItemDidChange 每秒调用一次
NSDocument presentedItemDidChange called every second
我正在研究 NSDocument
子类。它代表文本编辑器中的文本文件。
我正在尝试使用 the NSFilePresenter
protocol 来响应其他应用程序所做的更改(即,如果用户在 TextEdit 中保存更改,同时在此处打开同一文件)。
我目前的实现是这样的……
我为文件协调器添加了一个属性:
@property (nonatomic) NSFileCoordinator *fileCoordinator;
我懒得创造了:
- (NSFileCoordinator *) fileCoordinator {
if (!_fileCoordinator) {
[NSFileCoordinator addFilePresenter:self];
_fileCoordinator = [[NSFileCoordinator alloc] initWithFilePresenter:self];
}
return _fileCoordinator;
}
调用presentedItemDidChange
时,我从磁盘重新加载文件并显示它:
- (void)presentedItemDidChange {
[super presentedItemDidChange];
NSLog(@"presentedItemDidChange was called");
if (self.presentedItemURL.isFileURL && self.fileType) {
NSError *coordinatorError = nil;
[self.fileCoordinator coordinateReadingItemAtURL:self.presentedItemURL options:NSFileCoordinatorReadingWithoutChanges error:&coordinatorError byAccessor:^(NSURL *newURL) {
NSError *readError = nil;
[self readFromURL:newURL ofType:self.fileType error:&readError];
if (readError) NSLog(@"%@", readError);
}];
if (coordinatorError) NSLog(@"%@", coordinatorError);
[self reloadString];
}
}
此代码有效:当我在 TextEdit 中保存文件时,更改会出现在我的应用程序中。
但是,一旦我保存了这个文件,presentedItemDidChange
就会被重复调用(大约每秒一次)。几分钟后,应用程序因内存错误而崩溃。没有错误记录;控制台基本上是这样的:
2016-02-17 22:43:46.233 MacDown[66847:2470964] presentedItemDidChange was called
2016-02-17 22:43:51.721 MacDown[66847:2470960] presentedItemDidChange was called
2016-02-17 22:43:52.816 MacDown[66847:2471206] presentedItemDidChange was called
2016-02-17 22:43:53.819 MacDown[66847:2470964] presentedItemDidChange was called
2016-02-17 22:43:54.920 MacDown[66847:2471206] presentedItemDidChange was called
2016-02-17 22:43:56.014 MacDown[66847:2470964] presentedItemDidChange was called
2016-02-17 22:43:57.115 MacDown[66847:2471206] presentedItemDidChange was called
2016-02-17 22:43:58.117 MacDown[66847:2470964] presentedItemDidChange was called
这是我第一次使用这些 API,所以我想我犯了一个简单的错误。如果重要的话,我是 运行 OS X 10.11.3 和 Xcode 7.2。我做错了什么?
原来我不需要这些。 [NSDocument -readFromData:ofType:error:]
会在文件更改时自动调用,所以我只是在调用时用新数据更新 UI 。我误以为这个方法只调用了一次,在初始化的时候。
(我仍然不确定为什么 presentedItemDidChange
被重复调用。)
presentedItemDidChange
不仅会在文件内容更改时调用,还会在文件的元数据更改时调用。
并且[NSDocument -readFromData:ofType:error:]
覆盖文件的最后打开日期,文件元数据之一。
所以,这就是presentedItemDidChange
被重复调用的原因。如果要处理 presentedItemDidChange
中的更新文件,通常需要先确定更改的内容。
我正在研究 NSDocument
子类。它代表文本编辑器中的文本文件。
我正在尝试使用 the NSFilePresenter
protocol 来响应其他应用程序所做的更改(即,如果用户在 TextEdit 中保存更改,同时在此处打开同一文件)。
我目前的实现是这样的……
我为文件协调器添加了一个属性:
@property (nonatomic) NSFileCoordinator *fileCoordinator;
我懒得创造了:
- (NSFileCoordinator *) fileCoordinator {
if (!_fileCoordinator) {
[NSFileCoordinator addFilePresenter:self];
_fileCoordinator = [[NSFileCoordinator alloc] initWithFilePresenter:self];
}
return _fileCoordinator;
}
调用presentedItemDidChange
时,我从磁盘重新加载文件并显示它:
- (void)presentedItemDidChange {
[super presentedItemDidChange];
NSLog(@"presentedItemDidChange was called");
if (self.presentedItemURL.isFileURL && self.fileType) {
NSError *coordinatorError = nil;
[self.fileCoordinator coordinateReadingItemAtURL:self.presentedItemURL options:NSFileCoordinatorReadingWithoutChanges error:&coordinatorError byAccessor:^(NSURL *newURL) {
NSError *readError = nil;
[self readFromURL:newURL ofType:self.fileType error:&readError];
if (readError) NSLog(@"%@", readError);
}];
if (coordinatorError) NSLog(@"%@", coordinatorError);
[self reloadString];
}
}
此代码有效:当我在 TextEdit 中保存文件时,更改会出现在我的应用程序中。
但是,一旦我保存了这个文件,presentedItemDidChange
就会被重复调用(大约每秒一次)。几分钟后,应用程序因内存错误而崩溃。没有错误记录;控制台基本上是这样的:
2016-02-17 22:43:46.233 MacDown[66847:2470964] presentedItemDidChange was called
2016-02-17 22:43:51.721 MacDown[66847:2470960] presentedItemDidChange was called
2016-02-17 22:43:52.816 MacDown[66847:2471206] presentedItemDidChange was called
2016-02-17 22:43:53.819 MacDown[66847:2470964] presentedItemDidChange was called
2016-02-17 22:43:54.920 MacDown[66847:2471206] presentedItemDidChange was called
2016-02-17 22:43:56.014 MacDown[66847:2470964] presentedItemDidChange was called
2016-02-17 22:43:57.115 MacDown[66847:2471206] presentedItemDidChange was called
2016-02-17 22:43:58.117 MacDown[66847:2470964] presentedItemDidChange was called
这是我第一次使用这些 API,所以我想我犯了一个简单的错误。如果重要的话,我是 运行 OS X 10.11.3 和 Xcode 7.2。我做错了什么?
原来我不需要这些。 [NSDocument -readFromData:ofType:error:]
会在文件更改时自动调用,所以我只是在调用时用新数据更新 UI 。我误以为这个方法只调用了一次,在初始化的时候。
(我仍然不确定为什么 presentedItemDidChange
被重复调用。)
presentedItemDidChange
不仅会在文件内容更改时调用,还会在文件的元数据更改时调用。
并且[NSDocument -readFromData:ofType:error:]
覆盖文件的最后打开日期,文件元数据之一。
所以,这就是presentedItemDidChange
被重复调用的原因。如果要处理 presentedItemDidChange
中的更新文件,通常需要先确定更改的内容。