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"];