FCPostOffice 1.0.0

FCPostOffice 1.0.0

测试已测试
Lang语言 Obj-CObjective C
许可 MIT
发布上次发布2014年12月

未声明 维护。



  • Almer Lucke

FCPostOffice 使得您的应用程序的远程部分能够以结构化的方式进行通信。通常您不需要像 FCPostOffice 这样的工具,但如果您的应用程序真的很复杂,有很多视图控制器有时需要相互通信,FCPostOffice 提供了一个很好的解决方案。尽管有 NSNotificationCenter,但通知并不是非常具体。

FCPostOffice 是 NSNotificationCenter 的对立面。使用 FCPostOffice,您可以向特定地址发送消息。例如,如果一个视图控制器注册了地址 "viewcontroller1",另一个视图控制器可以通过向 "viewcontroller1" 发送消息来仅针对该特定视图控制器进行目标。

因为 FCPostOffice 使用 URL 类型的方案,在向已注册地址发送消息时可以进行子寻址。例如,如果一个对象在 "object1" 注册,我们通过地址 "object1/level1/part1" 向它发送消息,则消息将交付给在 "object1" 注册的处理程序,但传递给接收者的消息将设置其地址属性为 "level1/part1"。这样,接收者可以根据接收者部分进行进一步的路由。

安装

最简单的方法是使用 CocoaPods。如果您还没有这么做,这里有一个 指南

pod 'FCPostOffice', '~>1.0.0'

使用方法

您可以使用符合 FCPostOfficeMessageHandler 协议的对象进行处理器注册

[FCPostOffice registerHandler:self forAddress:@"appDelegate"];

FCPostOfficeMessageHandler 协议只包含一个必须由任何符合协议的对象实现的方法

- (void)handlePostOfficeMessage:(FCPostOfficeMessage *)message
{
    NSString *redirect = [NSString stringWithFormat:@"%@/Test", message.from];
    id obj = [FCPostOffice registeredHandlerForAddress:message.from];

    NSLog(@"message received from %@", obj);

    [FCPostOffice post:@"Hello viewcontroller" 
           contentType:@"string" 
                  from:@"appDelegate" 
                    to:@[redirect]];
}

但您也可以使用一个块来注册处理器

[FCPostOffice registerHandlerBlock:^(FCPostOfficeMessage *message) {
    NSLog(@"message \"%@\" from \"%@\" addressee \"%@\"", message.content, 
                                                          message.from, 
                                                          message.addressee);
} forAddress:@"appDelegate"];

当已注册到一个地址的对象无法处理任何传入的消息时(例如,当它被释放时),注销是一个明智之举

[FCPostOffice unregisterHandlerForAddress:@"appDelegate"];

要向一个或多个地址发布消息,您可以使用

[FCPostOffice post:@"Hello viewcontrollers" 
       contentType:@"string" 
              from:@"appDelegate" 
                to:@[@"viewcontroller1", @"viewcontroller2"]];

您可以获取在地址处注册的对象。请记住,如果没有人在注册或有编号为块完成注册,则此操作将返回 nil

[FCPostOffice registeredHandlerForAddress:@"appDelegate"];