比传递NSDictionaries更好的模式作为参数?

时间:2013-02-21 19:56:44

标签: ios objective-c macos model-view-controller design-patterns

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

..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是该通知的ThisObjectThatObject类型的键,确定您可以为这些键创建一些常量,但这并没有真正解决问题。

并且假设你有一个需要15个参数的函数,你不会用15个参数创建一个函数,只是传递一个字典会更容易(虽然不太可读)但现在你有相同的问题如上。

我在这些类的头文件中创建了“消息类”(即一个标题中的两个接口),而消息类只是一个对象列表,您定义并发送给创建更强合同的方法但这感觉不对。

如果我可以在标题中执行typeDef参数对象之类的操作,那就太棒了,但这不仅仅支持NSObject或{{1} int等等。

基本上我正在尝试在邮件发件人和邮件接收者之间建立更强大的合同,无论是功能还是通知。

3 个答案:

答案 0 :(得分:4)

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

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

如果您发现需要15个参数的方法,则需要退回并将这些参数封装到适当的类中。也许该方法适当地减少了几个参数和类或类似的东西。

答案 1 :(得分:2)

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

为参数对象提供一个简单的API,允许这两个类设置并获取您使用的特定字段--setThisKey:和getThisKey。实质上,这是在方法和类之间记录API。

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

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

您可以使用

封装所有这些内容
 [param withField: self.data];

通过工作,你可以经常让参数对象做很多有用的工作;这可以打破冗长的方法,帮助大班减轻责任。

答案 2 :(得分:0)

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


使用通知发件人怎么样?例如,您的对象Task已完成并发送通知。接收方使用发件人访问sender.resultsender.errorsender.anything


如果你想在这些对象(发送者/接收者)之间建立更强的联系,你可能应该使用其他方式而不是NSNotifications

一些替代方案:

  • 委托(或其他一些直接方法调用)
  • 靶+动作

所有这些都可以通过将它们存储在一个数组中而用作多个回调,并且它们不会使用NSDictionaries来传递值。