6

由于我们的代码库的成熟,我开始不喜欢传球的字典,以此来打包的消息传递,或者信息更糟糕的是,函数参数的模式。它需要发送和接收函数都有一个未公开的字符串文字API。比传递NSDictionaries作为参数更好的模式?

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

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

,然后在someClass的听众

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

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

你要记住,thisKeythatKey是该通知ThisObject类型和ThatObject的按键,相信你可以的地方创造一些常量,这些键,但这并不能真正解决问题。

而且可以说你有一个需要15个参数的函数,你不打算做一个函数与15个参数,它会更容易(虽然少可读性)只是传递一个字典,但现在你有与上面相同的问题。

我在那些类的头文件(即一个头文件中有两个接口)中创建了残缺的'Message Classes',而Message Class只是你定义并发送给创建更强壮的方法的对象列表合同,但这感觉错了。

这将会是巨大的,如果我可以做类似typeDef在头参数对象,但不支持NSObject的唯一的东西,像intfloat

基本上我想在消息发送者和消息接收者之间创建一个更强大的合同,即该功能或通知。

回答

4

你可以定义按键的常数。例如,请参阅UIKeyboardDidShowNotification的文档。有一个可用于获取有关通知的信息的所有密钥的链接。

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

如果你发现你有需要15个参数的方法,你需要退后一步,封装这些参数到合适的班级。也许这种方法适当地减少了几个参数和一个类或类似的东西。

+0

我提到键的常量并不是一个好的解决方案,因为你仍然需要去查找关键是什么,而不是为值(对象)的内容创建一个强有力的契约,更像是一个建议。将数据封装到一个类中是我正在研究的一个方向,但为我想要传递的每条消息创建一个类似乎很麻烦,无论是2个参数都是10,您不同意吗? – Shizam 2013-02-21 20:17:39

+0

@Shizam,如果这些消息将被放入不同的字典中,那么你可能需要不止一个类。但是,如果你谈论的是有时从字典中传递两个键的消息,有时候是10个,那么这仍然只是一个类对象。 – rdelmar 2013-02-21 20:30:17

+0

@rdelmar在我们的程序中,我们可能会有10-15个独特的通知,每个通知都需要自己的类来定义它的消息属性。 – Shizam 2013-02-21 21:42:44

2

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

给参数对象一个简单的API,让两个类都可以设置并获取您使用的特定字段 - setThisKey:和getThisKey。实质上,这就是在方法和类之间记录API。

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

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

您可以用

[param withField: self.data]; 

随着工作封装这一切,你可以经常做参数对象做很多有益的工作;这可以打破长期的方法,并帮助大班级摆脱多余的责任。

+0

我提到这是我正在看的解决方案,我看到的问题是必须为每条消息创建一个参数对象,看起来很麻烦。另外,似乎将该对象放置在拥有该消息的类的头部,这样在一个头部中就有两个接口,这似乎让人不悦。 – Shizam 2013-02-21 20:19:43

+0

您可以经常在多个相关方法中共享一个参数对象。 – 2013-02-21 21:18:00

+1

我看到没有人反对将接口添加到类的头文件中。但是你的参数对象的目标是向该对象添加许多有用的行为,而不仅仅是包装一些数据。所以,最终,参数对象可能在世界上拥有自己的位置。像NSURL这样的类以这种方式开始。 – 2013-02-21 21:20:47

0

起初,有15个参数不好,在这种情况下,你应该考虑不要做这样的回调或试图减少数量。


如何使用通知发件人?例如,您的对象Task已完成并发送通知。接收方使用发件人访问sender.result,sender.error,sender.anything


如果你想这些对象之间的强联系(发送器/接收器),也许你应该使用的通信,而不是NSNotifications的一些其他的方式。

一些替代方案:

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

它们都可以作为一对多通过将它们存储在一个数组中,并且它们不使用NSDictionaries进行值传递。

+0

我们也使用代表和块,我只是使用NSNotifications作为示例,其中很容易看到问题。我仍然有这个块的问题等,但我开始认为创建参数对象来包含参数几乎是唯一的方法来做到这一点。 – Shizam 2013-02-21 23:10:40