【问题标题】:How to implement VDKQueue to monitor a file in Cocoa?如何实现 VDKQueue 来监控 Cocoa 中的文件?
【发布时间】:2013-01-12 21:27:48
【问题描述】:

我一直在环顾四周,看起来 VDKQueue 是 UKKQueue 的更现代版本,但我在实现它时遇到了麻烦(我还不擅长 Cocoa)。 到目前为止我有这个,但我对我还需要什么(或者如果这甚至是正确的)有点茫然:

VDKQueue *kqueue = [[VDKQueue alloc] init];
[kqueue addPath:path notifyingAbout:VDKQueueNotifyAboutWrite];
[kqueue setDelegate:self];

这个答案似乎很好地概述了如何设置它,我只是不太明白。 现在我已经初始化了 VDKQueue,如何设置修改文件时发生的情况?

Cocoa Monitor a file for modifications

从另一个答案:

实现非常简单:

  • 让你的控制器成为VDKQueueDelegate; (我在 AppDelegate.h 中添加了<VDKQueueDelegate>
  • 声明一个VDKQueue* ivar / 属性; (这是VDKQueue *kqueue = [[VDKQueue alloc] init];吗?)
  • 设置委托方法VDKQueue:receivedNotification:forPath:; (我该怎么做?)
  • 初始化队列并将其委托设置为控制器本身; (这是[kqueue setDelegate:self];?)
  • 使用addPath:notifyingAbout: 添加要观看的资源。 (添加此行[kqueue addPath:path notifyingAbout:VDKQueueNotifyAboutWrite];

那就用委托方法做你的事情吧。

可能是代码中的委托方法?

//
//  Or, instead of subscribing to notifications, you can specify a delegate and implement this method to respond to kQueue events.
//  Note the required statement! For speed, this class does not check to make sure the delegate implements this method. (When I say "required" I mean it!)
//
@class VDKQueue;
@protocol VDKQueueDelegate <NSObject>
@required

-(void) VDKQueue:(VDKQueue *)queue receivedNotification:(NSString*)noteName forPath:(NSString*)fpath;

@end

【问题讨论】:

  • 这就是最后一行告诉你的内容:“在委托方法中做你的事情”。委托方法是您的回调。
  • 你介意扩展一下吗?我不太明白。我用我拥有的代码更新了上面的几点

标签: objective-c cocoa queue vdkqueue


【解决方案1】:

有几种方法,它们都记录在the VDKQueue header file中。

方法 A:通知

Add an observer on the NSWorkspace's notification center 用于该头文件中列出的各种 VDKQueue 通知。当 VDKQueue 发送您正在观察的通知时,通知中心将调用您的块(或向您自己的观察者对象发送消息,如果您使用旧的但仍然完全有效的方法)。

方法 B:委托

您已经将自己设置为代理人,这是其中的步骤之一。

第 1 步是声明您符合VDKQueueDelegate 协议。如果你还没有这样做,你应该会收到一个警告,因为setDelegate: 需要一个符合协议的对象。

第 2 步是通过实际实现协议的所有必需方法来实现该承诺。目前只有一个。

第 3 步是将自己设置为代表。

在您的VDKQueue:receivedNotification:forPath: 实现中,这是您在第 2 步中实现的方法,您可以做任何您想做的事情来对文件刚刚发生的事情做出反应。

【讨论】:

  • 我从来没有真正使用过 NSWorkspace 或委托,对于初学者来说,哪一个更容易实现? (代表们看起来有点吓人)
  • @urbanrider:NSWorkspace 唯一的参与就是获取通知中心;从那里开始,这都是通知中心的逻辑。委托方法其实更简单。
  • 好的,所以在我的 AppDelegate.h 文件中添加了 @interface AppDelegate : NSObject &lt;VDKQueueDelegate&gt;{,这从 [kqueue setDelegate:self]; 中删除了警告我仍然不明白在文件更新时将要运行的代码放在哪里?
  • @urbanrider:在你的委托方法的实现中。
  • @urbanrider:@required 表示如果您想符合协议,则需要实现该方法。如果您声明一致性 (@interface MyClass : … &lt;VDKQueueDelegate&gt;) 但没有实现所有必需的方法,编译器会警告您,您的程序可能会崩溃。您只需实现所有必需的方法即可满足要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多