Objective c 每秒调用一次NSDocument presentedItemDidChange

Objective c 每秒调用一次NSDocument presentedItemDidChange,objective-c,macos,nsdocument,nsfilecoordinator,Objective C,Macos,Nsdocument,Nsfilecoordinator,我正在处理一个NSDocument子类。它表示文本编辑器中的文本文件 我试图使用来响应其他应用程序所做的更改(即,如果用户在此处打开同一文件时将更改保存在TextEdit中) 我当前的实现是这样工作的 我为文件协调器添加了一个属性: @property (nonatomic) NSFileCoordinator *fileCoordinator; 我懒散地创建它: - (NSFileCoordinator *) fileCoordinator { if (!_fileCoordinat

我正在处理一个
NSDocument
子类。它表示文本编辑器中的文本文件

我试图使用来响应其他应用程序所做的更改(即,如果用户在此处打开同一文件时将更改保存在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,所以我认为我犯了一个简单的错误。如果重要的话,我正在运行OSX10.11.3和Xcode 7.2。我做错了什么?

原来我根本不需要这些
[NSDocument-readFromData:ofType:error://code>会在文件更改时自动调用,因此我只需在调用时用新数据更新UI。我错误地认为这个方法在初始化期间只调用了一次


(我仍然不知道为什么反复调用了
presentedItemDidChange

结果证明我不需要这些
[NSDocument-readFromData:ofType:error://code>会在文件更改时自动调用,因此我只需在调用时用新数据更新UI。我错误地认为这个方法在初始化期间只调用了一次


(我仍然不确定为什么重复调用了
PresentedEditdChange

PresentedEditdChange
不仅会在文件内容更改时调用,还会在文件元数据更改时调用。 和
[NSDocument-readFromData:ofType:error:
覆盖文件的最后打开日期,即文件元数据之一

因此,这就是反复调用
presentedItemDidChange
的原因。如果要在
presentedItemDidChange
中处理更新的文件,通常需要确定首先更改了什么


cf.

presentedItemDidChange
不仅在文件内容更改时调用,而且在文件元数据更改时调用。 和
[NSDocument-readFromData:ofType:error:
覆盖文件的最后打开日期,即文件元数据之一

因此,这就是反复调用
presentedItemDidChange
的原因。如果要在
presentedItemDidChange
中处理更新的文件,通常需要确定首先更改了什么


cf.

您是否设置了调用
readFromData:ofType:error:
的任何内容?我试图重现这个过程,但只调用了
presentedItemDidChange
(我也委托给
super
)。不过,它只叫了一次,不是每秒钟都叫一次。我怀疑这是导致更改的无关因素。您是否设置了调用
readFromData:ofType:error:
的任何设置?我试图重现这个过程,但只调用了
presentedItemDidChange
(我也委托给
super
)。不过,它只叫了一次,不是每秒钟都叫一次。我怀疑这是不相关的原因导致了这些变化。