ios - 如何在一个类中实现两个相同类型的委托(delegate)?

标签 ios objective-c delegates

我正在为这种情况寻找好的模式。让我们与委托(delegate)一起上课:

@protocol MyDelegate
-(void) someEvent;
@end

@interface MyServiceClass
@property (nonatomic,weak) id<MyDelegate> delegate;
@end

我们有这个类的两个实例。例如 serviceObject1 和 serviceObject2。现在在我们的 Controller 中,我们希望接收来自两个实例的事件:
-(void) registerDelegates {
    serviceObject1.delegate=self;
    serviceObject2.delegate=self;
}

-(void) someEvent {
  // do something
}

一切都很好,除了来自两个实例的事件将被抛出到一个 someEvent 方法。对我来说,将事件从 serviceClass1 和 serviceClass2 分离到不同的方法会更舒服。

我看到了三种方法,但不喜欢其中任何一种:
  • 将调用者的实例作为 someEvent 的参数发送,并检查此事件来自哪个实例并重定向到适当的方法。
  • 在我的 Controller 中创建两个假对象并将它们注册为 service1Class 的委托(delegate)。并从此对象调用我的 Controller 中的不同方法。
  • 使用匿名 block 而不是委托(delegate)。不错的决定,但我不知道如何取消注册。

  • 可能存在我错过的另一个解决方案吗?

    最佳答案

    处理这种情况的方法是将 MyServiceClass 实例作为方法参数之一传递,基本上就是您为 #1 编写的内容。

    这就是 Apple 的做法,也是一种标准做法。

    @protocol MyDelegate
    -(void) someEventFromService:(MyServiceClass *serviceClass);
    @end
    

    关于ios - 如何在一个类中实现两个相同类型的委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33318557/

    相关文章:

    ios - 如何让Master VC出现在UISplitViewController的右边?

    ios - 在 iOS 9.2.1/XCode 7.2 中执行 segue 时偶尔出现黑屏

    ios - NSNotificationCenter addObserver 被忽略

    ios - 只绘制 ImageVIew 框架的角

    c# - 在 C# 中将 EventHandler 类型 var 等同于委托(delegate)意味着什么?

    c# - 将函数作为参数传递给 Action

    swift - 使用 Swift 委托(delegate)

    ios - 我怎样才能触发我的 iphone 应用程序从我的 mac 应用程序启动

    ios - 如果在 iOS 上使用系统帐户进行​​身份验证,则无法检索 Twitter 电子邮件

    ios - 如何保证在 didFinishLaunchingWithOptions 之前在 View Controller 中注册通知?