6

随着我们的代码库的成熟,我开始不喜欢传递字典的模式来打包消息传递的信息,或者更糟糕的是,函数参数。它需要发送和接收函数都具有未记录的字符串文字 API。

..in some function..
NSDictionary *info = [NSDictionary dictionaryWithObjectsAndKeys:
                         thisObject, @"thisKey",
                         thatObject, @"thatKey",
                         nil];

[[NSNotificationCenter defaultCenter] postNotificationName:@"MY_NOTIFICATION" object:nil userInfo:info];
....

然后 insomeClass的听众

- (void)someClassListener:(NSNotification *)notification {
    NSDictionary *info = [notification userInfo];

    ThisObject *ob1 = [info objectForKey:@"thisKey"];
    ThatObject *ob2 = [info objectForKey:@"thatKey"];
}

您必须记住,thisKey并且thatKey是类型的键,ThisObject并且ThatObject对于该通知,确保您可以在某处为这些键创建一些常量,但这并不能真正解决问题。

假设你有一个需要 15 个参数的函数,你不会创建一个有 15 个参数的函数,只传递一个字典会容易得多(虽然可读性较差),但现在你遇到了与上面相同的问题.

我尝试在这些类的头文件中创建存根的“消息类”(即一个头文件中的两个接口),而消息类只是您定义并发送到创建更强大合同的方法的对象列表,但这感觉错误的。

如果我可以typeDef在标头中执行诸如参数对象之类的操作,但它不支持NSObject仅诸如intor之类的东西,那就太好了float

本质上,我试图在消息发送者和消息接收者之间创建一个更强大的合同,无论是功能还是通知。

4

3 回答 3

4

您可以为键定义常量。作为示例,请参阅文档以UIKeyboardDidShowNotification获取示例。有一个指向所有键的链接,可用于获取有关通知的信息。

更好的方法是将数据封装到类而不是字典中。创建一个带有属性的简单类。这将比字典更能自我记录。您可以在 .h 文件中查看属性名称和属性类型。

如果您发现您有需要 15 个参数的方法,则需要退后一步并将这些参数封装到适当的类中。也许该方法正确地简化为几个参数和一个类或类似的东西。

于 2013-02-21T20:06:33.500 回答
2

你想要的是一个参数对象,一个封装了一堆字段以便与其他类进行通信的小对象。在内部,参数对象可能包含一个字典,或者只是一组指定字段。

为参数对象提供一个简单的 API,让两个类都可以设置和获取您使用的特定字段 -- setThisKey: 和 getThisKey。从本质上讲,它记录了方法和类之间的 API。

接下来,寻找机会将功能移动到参数对象中。例如,如果你有这样的事情:

 param.fieldSize=[self.data size];
 param.fieldColor=[self.data color];
 param.flavor=[self.data lookUpTheRecipe]

你可以用

 [param withField: self.data];

通过工作,您通常可以使参数对象做很多有用的工作;这可以分解长方法并帮助大类摆脱多余的责任。

于 2013-02-21T20:07:24.597 回答
0

起初,有 15 个参数并不好,在这种情况下,您应该考虑不进行此类回调或尝试减少数量。


那么使用通知的发送者呢?例如,您的对象Task完成并发送通知。接收方使用发送方访问sender.result, sender.error, sender.anything.


如果您希望这些对象(发送者/接收者)之间的联系更紧密,也许您应该使用其他通信方式而不是NSNotifications.

一些替代方案:

  • 委托(或其他类型的直接方法调用)
  • 目标+行动

通过将它们存储在数组中,它们都可以用作多个回调,并且它们不NSDictionaries用于值传递。

于 2013-02-21T22:23:12.113 回答