2

在我正在开发的 iphone 应用程序中,我使用自定义类来管理与主机的网络通信。名为protocolClass 的类是appDelegate 中的ivar 和applicationDidFinishLaunching: 方法中的alloc + init。

现在,每当 protocolClass 从主机接收数据时,它都会在其委托(我将其设置为 appDelegate)中调用 protocolClassDidReceiveData: 方法。然后我需要更新 UINavigatorController 中一个 customViewController 中的数据。

我应该只添加对我需要在 appDelegate 中更新的 customViewController 的引用吗?还是有其他更有效的方法?

如果我要保留对 customViewcontroller 的引用,那么内存使用的后果是什么?

提前致谢。

4

2 回答 2

2

如果我猜对了,您想在程序的某个不相关部分发生事件后更新视图。

为了减少代码中的依赖项数量,我建议使用 NSNotification 而不是更紧密耦合的实例变量。通知是一个 Cocoa 概念,它允许您的代码的一部分发出类似事件的消息,任何数量的侦听器都可以注册。

在您的情况下,它看起来像这样:

AppDelegate 标头:

extern NSString* kDataReceived;

AppDelegate 实现:

NSString* kDataReceived = @"DataReceived";

- (void)protocolClassDidReceiveData:(NSData*)data {
    [[NSNotificationCenter defaultCenter] postNotificationName:kDataReceived
                                                        object:self
                                                      userInfo:data];
}

在一些感兴趣的监听器类(例如你的 UIViewController)的实现中:

// register for the notification somewhere
- (id)init
{
    self = [super init];
    if (self != nil) {
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(dataReceivedNotification:)
                                                     name:kDataReceived
                                                   object:nil];
    }
}

// unregister
- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

// receive the notification
- (void)dataReceivedNotification:(NSNotification*)notification
{
    NSData* data = [notification userInfo];
    // do something with data
}
于 2009-06-03T16:45:44.660 回答
2

是的,通知是一个很好的方法。而当模型想要更新控制器 [即 ViewController] 时,通知是一种很好的方式。就我而言,我正在尝试使用 SSDP(使用 AsyncUdpSocket)发现设备,并且我想在找到设备时更新/通知我的视图控制器。由于这是异步的,所以当接收到数据时,我使用了通知。这是我做的简单的事情:

在 viewDidLoad 中(我尝试覆盖 init 但这对我来说效果不佳) - 我为我的 ViewController 注册了如下通知:

*NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    [nc addObserver:self
           selector:@selector(foundController:) 
               name:@"DiscoveredController"
             object:nil];

这是我的 ViewController 中的选择器:

// receive the notification
- (void)foundController:(NSNotification *)note
{
    self.controllerFoundStatus.text = @"We found a controller";
}

在我的“模型”[不是应用程序委托中-我创建了一个新类,用于发现设备“serviceSSDP”,我所做的只是发布如下通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"DiscoveredController" object:nil];

就是这样。当我收到对我的 SSDP 发现的正确响应时,就会发布此通知 [特别是在:

- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock 
     didReceiveData:(NSData *)data 
            withTag:(long)tag 
           fromHost:(NSString *)host 
               port:(UInt16)port

AsyncUdpSocket 的。

于 2012-03-02T03:41:38.370 回答