处理Objective-C中缺少闭包的问题

时间:2010-03-22 18:08:05

标签: iphone objective-c design-patterns closures

也许这只是我最近一直在使用http://nodejs.org/的事实,但Objective-C(iphone)中缺少关闭一直很难解决。

例如,我正在创建服务类。每个服务类都可以有多个方法,每个方法都会生成不同的URL请求。我可以使用委托模式,但这意味着每次我想在其上调用方法时都必须创建一个新服务(因为它必须存储该请求的委托和选择器,并且新方法调用将覆盖它们) 。

对我来说更难的是我不能轻易地将局部变量保留在回调范围内。我必须存储我想要发送回服务类本身的委托的任何内容,这使得在每个类上拥有多个方法变得更加困难。

专业人士如何做到这一点?我应该放弃抱怨并以另一种方式做到吗?

3 个答案:

答案 0 :(得分:10)

最近引入Objective-C的

Blocks启用了闭包。唯一的问题是你不能在iPhone上使用它们。这里有第三方解决方案,Plausible Blocks - 他们也在iPhone上提供此功能。

更新:使用iPhone上的块的示例项目可以找到here

答案 1 :(得分:7)

每当你发现自己需要多个代表时,答案就是通知。

对于类似服务类的东西,您可能会制作一个单例,并在通过通知完成服务请求时通知相关方。

并不是说块不是解决这个问题的有趣方法,只是我觉得你应该知道有其他选择。

答案 2 :(得分:1)

我不是专业人士,但我一直在努力解决同样的问题所以这是迄今为止我所做的最好的事情:

@interface MyCallback : NSObject
  id target;
  SEL action;
  id value1;
  id value2;
  ...
@end

当我需要调用一些会通知我完成的内容时,我会用实际的回调(通常是“self”和一个方法)填充设置目标和动作,然后填写其他值,稍后我需要将其转换为value1..2..3被调用者挂起到MyCallback对象,当时间到来时,它调用目标/动作并将MyCallback作为参数传递。这就是我获得“封闭”的方式。

为了解决你的另一个问题,这里有一个想法:创建一个派生自NSURLConnection的类,名为MYURLConenction,只有add是一个类型为“id”的字段,称之为MyStuff。然后继续使用MYURLConenction而不是NSURLConnection - 当您发出网络请求时,您可以将您的数据(例如MyCallback的实例)填充到MyStuff中,它将为您保留它们。因此,您不需要为每次调用创建服务类的新实例。

这实际上不是我这样做的方式 - 我只是创建了一个通用的MyHTTPRequest包装类,它是NSURLConnection的委托,它接受一个URL& NSString POST主体,处理所有网络内容并向调用者返回NSString结果和NSError - 稍微高一点的抽象。它还存储了MyStuff,因此如果需要,服务类可以保持单例。