0

我已经尝试过这个问题: 代表如何工作,但我似乎仍然没有完全掌握它。我正在尝试使用 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。问题是,我不知道把这个方法放在哪里(我有几个视图,有几个头文件/实现文件)。我希望这个方法成为委托方法,但我不知道如何使它成为委托方法。我想从我的角度调用这个委托方法。

如果有人可以解释:

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

我整天都被困在这个问题上,我正要扔毛巾大声笑。非常感谢任何和所有帮助。非常感谢!

编辑:

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

4

3 回答 3

0

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

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

这是 的委托方法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];
}
于 2012-06-05T20:57:24.043 回答
0

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

以下是回答您的 3 个项目符号问题的一些提示:

我把这段代码放在哪里?

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

如何使它成为委托方法?

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

如何调用此委托方法

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

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

于 2012-06-05T21:03:13.357 回答
0

要制作委托,您将在头文件中声明这些内容。下面的例子。

//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 时,您可以将delegateself 设置为任何类型。现在在您的 SomeClass 文件中,您可以执行

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

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

于 2012-06-05T21:06:00.430 回答