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

Iphone 处理Objective-C中缺少闭包的问题,iphone,objective-c,design-patterns,closures,Iphone,Objective C,Design Patterns,Closures,也许这只是我最近一直在使用的一个事实,但是Objective-C(iphone)中缺少闭包真的很难解决 例如,我正在创建服务类。每个服务类可以有几个方法,每个方法都会发出不同的URL请求。我可以使用委托模式,但这意味着每次我想对其调用方法时都必须创建一个新服务(因为它必须存储该请求的委托和选择器,而新方法调用将覆盖它们) 对我来说更困难的是,我不能轻易地将局部变量保留在回调的范围内。我必须将我想要发送回委托的任何内容存储在服务类本身上,这使得在每个类上有多个方法变得更加困难 你是怎么做到的?我是

也许这只是我最近一直在使用的一个事实,但是Objective-C(iphone)中缺少闭包真的很难解决

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

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

你是怎么做到的?我是否应该停止抱怨,换一种方式来做呢?

最近引入Objective-C,启用闭包。唯一的问题是你不能在iPhone上使用它们。这是第三方解决方案,他们在iPhone上也提供了这一功能


更新:可以在iPhone上找到使用blocks的示例项目。

每当您发现自己需要多个代理时,答案就是通知

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


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

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

@interface MyCallback : NSObject
  id target;
  SEL action;
  id value1;
  id value2;
  ...
@end
当我需要调用将通知我完成的内容时,我用实际回调(通常是“self”和一个方法)填充set target和action,并将稍后需要的其他值填充到value1..2..3中,被调用方挂起MyCallback对象,当时间到来时,它调用target/action并将MyCallback作为参数传递。这就是我如何得到我的“结束”

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


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

我想解决这两个问题的一个丑陋方法是为需要存储的所有内容创建类变量,如“methodOneDelegate”和“methodTwoDelegate”以及“MethodOneDatainedTokeApparound”。你明白了。我在PB网站上没有看到任何代码示例。它们的语法与普通块完全相同?我已经在一些项目中使用过它们,但由于各种原因,它们没有进入应用商店。但由于没有使用私有框架,我相信苹果不会拒绝这样的应用。看似合理的块与普通块完全相同——它们本质上只是移植了苹果的编译器更改,以便在10.5和iPhone上工作,所以实际上是相同的代码。它可以工作,但Cocoa Touch本身仍然没有太多的支持(例如,iPhone上不存在NSBlockOperation,因此如果您需要,您需要自己实现它)。@Sean Clark Hess-是的,完全相同。我可以向您发送我在玩游戏时构建的测试应用程序的源代码them@zakovyrya-那太好了。不知道如何通过这样的方式连接。你能在这里贴个链接吗github是做这种事情的好地方哈。。。这与我想要采用的方法(并非不好)完全相反,因为闭包将信息本地化,而通知是完全全局的。有趣的是,我认为通知本质上是本地的,因为只有使用它们的类知道它们存在。他们只是碰巧在一辆全球巴士上旅行。。。单例显示为全局的方式相同,但您可以使用它们来隔离对对象池的引用。虽然这是一种解决方案,但我认为无论在编码还是在性能方面,它都比使用块更重。是的,在性能方面更重。但是通知也可以更灵活,因为添加其他侦听器来做出反应很容易。我不确定它在编码方面有多大不同。。。提出一个示例任务并比较如何使用这两种机制来完成,这将是非常有趣的。在通知的情况下,您基本上将代码拆分为程序的至少两个逻辑单元——一个用于注册事件,另一个用于处理它,这对代码维护人员来说几乎不需要更多的工作(通常还有存储在某处的上下文)。在小规模上,这是可以忽略的,但对成熟的应用程序来说可能是一个真正的难题。当您为某个事件分配闭包时,您的代码嵌套在同一个逻辑单元中。读取器在执行闭包后会遇到较少的问题。是的,我考虑过这种方法。它工作得很好,但必须在回调上强制转换和抛出传递数据是一个难题虽然我给出的示例可能不是完美的用例,但块确实是回调保留变量的最佳方式。谢谢!当然,块更好。就我个人而言,我太害羞了,不敢使用被黑客攻击的编译器(天知道有什么样的bug)所以我用现有的工具凑合着用。什么,你不想6个月后随机出现bug吗?你的冒险意识在哪里