多次下载的NSnotifications

时间:2011-04-08 08:18:50

标签: iphone objective-c nsnotifications

我有一个解析器类和一些视图控制器类。在解析器类中,我发送请求并接收异步响应。我想要多个下载,比如每个viewcontroller一个。所以我在每个类中注册一个观察者:

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataDownloadComplete:) name:OP_DataComplete object:nil];

然后在:

发布通知
-(void)connectionDidFinishLoading:(NSURLConnection *)connection method of the parser class.
[[NSNotificationCenter defaultCenter] postNotificationName:OP_DataComplete object:nil];

但是在运行代码时第一个viewcontroller工作正常,但是对于第二个以后的下载和解析器类发布通知无限后代码进入第一个类的dataDownloadComplete:方法虽然我每次都在选择器中指定了不同的方法名称。我不明白错误是什么。请帮忙。提前谢谢。

2 个答案:

答案 0 :(得分:1)

两个视图控制器都在监听通知,因此应该一个接一个地调用这两个方法。

有几种方法可以解决这个问题。最简单的方法是通知包含视图控制器可以查看的某种标识符,以查看它是否应该忽略它。 NSNotifications有一个userInfo属性。

NSDictionary *info = [NSDictionary dictionaryWithObjectsAndKeys:@"viewController1", @"id", nil];
[[NSNotificationCenter defaultCenter] postNotificationName:OP_DataComplete object:self userInfo:info];

当您收到通知时,请检查它的用户名称:

- (void)dataDownloadComplete:(NSNotification *)notification {
    NSString *id = [[notification userInfo] objectForKey:@"id"];
    if (NO == [id isEqualToString:@"viewController1"]) return;

    // Deal with the notification here
    ...
}

还有其他一些方法可以处理它,但是在不了解你的代码的情况下,我无法解释它们 - 基本上你可以指定你想要收听通知的对象(看看我有{{1}但是你发送了object:self),但有时你的架构不会允许这种情况发生。

答案 1 :(得分:0)

最好创建一个协议:

@protocol MONStuffParserRecipientProtocol
@required
- (void)parsedStuffIsReady:(NSDictionary *)parsedStuff;
@end

并声明视图控制器:

@class MONStuffDownloadAndParserOperation;

@interface MONViewController : UIViewController < MONStuffParserRecipientProtocol >
{
  MONStuffDownloadAndParserOperation * operation; // add property
}
...
- (void)parsedStuffIsReady:(NSDictionary *)parsedStuff; // implement protocol

@end

并将一些后端添加到视图控制器

- (void)displayDataAtURL:(NSURL *)url
{
    MONStuffDownloadAndParserOperation * op = self.operation;
    if (op) {
        [op cancel];
    }

    [self putUpLoadingIndicator];

    MONStuffDownloadAndParserOperation * next = [[MONStuffDownloadAndParserOperation alloc] initWithURL:url recipient:viewController];
    self.operation = next;
    [next release], next = 0;
}

并让操作保持在视图控制器上:

@interface MONStuffDownloadAndParserOperation : NSOperation
{
  NSObject<MONStuffParserRecipientProtocol>* recipient; // << retained
}

- (id)initWithURL:(NSURL *)url Recipient:(NSObject<MONStuffParserRecipientProtocol>*)recipient;

@end

并在下载和解析数据时将操作消息作为收件人:

// you may want to message from the main thread, if there are ui updates
[recipient parsedStuffIsReady:parsedStuff];

还有一些要实施的东西 - 它只是一种形式。它更安全,涉及直接消息传递,引用计数,取消等等。