【问题标题】:Creating/Invoking Objective-C Delegate Methods Objective-C创建/调用 Objective-C 委托方法 Objective-C
【发布时间】:2012-06-05 19:58:51
【问题描述】:

我已经尝试过这个问题:How Does A Delegate Work,但我似乎仍然没有完全掌握它。我正在尝试使用 CocoaAsyncSocket 库来创建 TCP 套接字连接。感谢一位非常友好的 SO 用户的帮助,我有以下代码来执行对服务器的读取数据请求:

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
    NSData *strData = [data subdataWithRange:NSMakeRange(0, [data length])];
    NSString *msg = [[NSString alloc] initWithData:strData encoding:NSUTF8StringEncoding];
    if(msg)
    {
        NSLog(@"RX:%@",msg);
    }
}

现在,请原谅我的无知,因为我对 iOS 开发还很陌生。所以现在我有了这个方法,我想调用它来执行我的 ReadData。问题是,我不知道把这个方法放在哪里(我有几个视图,有几个头文件/实现文件)。我希望这个方法成为委托方法,但我不知道如何使它成为委托方法。我想从我的角度调用这个委托方法。

如果有人能解释一下:

  • 我应该把这段代码放在哪里? (什么文件等)
  • 如何使它成为委托方法?
  • 如何调用此委托方法?

我一整天都被困在这个问题上,我正准备把它扔掉,哈哈。非常感谢任何和所有帮助。非常感谢!

编辑:

这是上一个问题的桥梁,但我认为该问题与这个问题没有太大的相关性。 Question

【问题讨论】:

  • 澄清一下,你是想调用这个方法,传入参数,然后获取msg作为返回值吗?
  • 这是一个函数,它是 CocoaAsyncLibrary 的一部分。我在上面编辑了我的问题,因为这个问题是我第一个问题的桥梁。但是,我认为我的第一个问题中的任何细节都不相关。

标签: iphone objective-c ios delegates


【解决方案1】:

感谢更新。现在更清楚了。 这里有一些答案。如果不清楚,请告诉我。

- 我把这段代码放在哪里? (什么文件等)

这是CocoaAsyncSocket 的委托方法。回到您的第一个问题,当您初始化它时,您将自己(您的 appDelegate)设置为委托。

socket = [[AsyncSocket alloc] initWithDelegate:self];

这意味着,你将被另一个班级召唤。所以这意味着这个方法应该在你初始化对象的同一个类中(这里是socket)并将它设置为委托。所以它留在 appDelegate

- 我如何使它成为委托方法?

你没有。这本身就是一个委托方法。

- 我如何调用这个委托方法?

你没有。另一个类(此处为 AsyncSocket)将调用它。

您现在可能会问,您如何将数据传递给您的viewControllers? 这取决于你的设计。一旦调用此方法并通知您存在连接并且正在读取数据,根据您的设计,您可以将数据传递给其他视图控制器。一种方法是使用NSNotification。例如

// Call this in onSocket:didReadData:withTag: instead of logging
[[NSNotificationCenter defaultCenter] postNotificationName:@"DataIsReadNotification" object:msg]



// In one of your view controllers
// View controllers insterested in this message, register to get notified:
// add to -viewDidLoad
[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateViewWithNotification:) name:@"DataIsReadNotification" object:nil];
...
// and somewhere in the view controller class implement this
- (void)updateViewWithNotification:(NSNotification *)notification {
NSString *msg = [notification object];
}

【讨论】:

  • 这是一个很好的描述。我现在更好地理解了这一点。我已将我的方法 onSocket:didReadData:withTag: 方法放在我的 appDelegate 中。我没有从 readData 中看到我的 NSLog 中的任何内容,但这可能是因为没有准备好从服务器端读取的数据(另一个人正在处理服务器端应用程序)。再次感谢您的帮助!
  • 使用调试模式,我单步执行我的代码并意识到这个方法 (onSocket:didReadData:withTag:) 甚至没有被调用。正如我所说,我所做的只是将我的 add onSocket:didReadData:withTag: 方法添加到我的 appDelegate.m 文件的底部。我不知道你是否使用 Skype,但如果你是 Skype 用户,你可以通过 CaffeineWakeUp 与我联系。看来我真的很接近解决这个问题了。谢谢!
  • 通过一些挖掘,我想我能够弄清楚。我将继续努力,如果遇到麻烦,我会提出一个新问题。看起来我已经掌握了调用这些方法的窍门。再次感谢大家的帮助!
  • 很高兴它有帮助。 onSocket:didReadData:withTag: 方法没有被调用的原因,可能是因为你的 appDelegate 没有采用委托。如果是这样,在appDelegate.h 中,您应该在@interface 的行尾添加<GCDAsyncSocketDelegate>。概念和思路与UITableViewDataSourceUITableViewDelegate完全相同。你也可以随时给我发电子邮件。
【解决方案2】:

要创建委托,您需要在头文件中声明这些内容。下面的例子。

//SomeClass.h

@protocol SomeClassDelegate <NSObject>
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag;
@end


@interface SomeClass : NSObject {

id<SomeClassDelegate>delegate;

}
@property(nonatomic,assign)id<SomeClassDelegate>delegate;
@end

现在,当您初始化 SomeClass 时,您可以将 delegate 设置为任何 self。现在在你的 SomeClass 文件中,你可以做

[self.delegate onSocket: .. didReadData: .. withTag:];

如果该方法存在于您设置为 SomeClass 的委托的类中,它将调用它。希望这会有所帮助。

【讨论】:

    【解决方案3】:

    我不熟悉- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag 方法,但在 iOS 中使用委托是让您的对象相互通信而不引入一些依赖项的非常常见的方式。

    这里有一些提示可以回答您的 3 个项目符号问题:

    我应该把这段代码放在哪里?

    最好的选择是在您希望执行 ReadData 的控制器中或在 appDelegate 中

    如何使它成为委托方法?

    如果此方法已在协议中定义,则根据定义,这已是委托方法。您只需要让您的 viewcontroller 类符合此协议并使您的控制器成为此方法的委托。

    如何调用此委托方法

    您不调用委托方法。您有另一个属于此 CocoaAsyncSocket 库的对象,它将调用此委托方法。您只需在控制器的委托方法中处理一些代码,因为您已将其定义为将处理此方法的对象。

    只需将委托视为将某些工作推迟到其他对象的一种方式(顺便说一句,这是一种设计模式)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-02
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多