我尝试过这个问题:代表如何工作,但我似乎仍然没有完全掌握它。 我正在尝试使用 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。 问题是,我不知道将此方法放在哪里(我有几个视图,有几个头/实现文件)。 我希望此方法是委托方法,但我不知道如何使其成为委托方法。 我想从我的角度调用这个委托方法。
如果有人能解释:
- 我应该把这个代码放在哪里? (什么文件等)
- 如何将其设置为委托方法?
- 如何调用此委托方法?
天都被困在这个上面,我正要把它扔毛巾,哈哈。 非常感谢任何和所有的帮助。 非常感谢!
编辑:
这是与前一个问题的一个桥梁,但我认为这个问题与这个问题没有太大关系。 问题
感谢您的更新。现在更清楚了。这里有一些答案。如果不清楚,请告诉我。
- 我把这个代码放在哪里?(什么文件等)
这是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];
}
要创建委托,您需要在头文件中声明该内容。下面是示例。
//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
设置为任何自我。现在在你的SomeClass文件中,你可以做
[self.delegate onSocket: .. didReadData: .. withTag:];
如果该方法存在于您设置为SomeClass委托的类中,它将调用它。希望这有帮助。
我不熟悉- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
方法,但在 iOS 中使用委托是让对象相互通信而不引入一些依赖项的非常常见的方法。
以下是回答您的 3 个要点问题的一些提示:
我应该把这个代码放在哪里?
最好的选择是在您希望执行 ReadData 的控制器中或在 appDelegate 中
如何将其设置为委托方法?
如果此方法已在协议中定义,则根据定义,此方法已是委托方法。您只需要让您的视图控制器类符合此协议,并使控制器成为此方法的委托。
如何调用此委托方法
不调用委托方法。您有一个属于此 CocoaAsyncSocket 库的另一个对象,它将调用此委托方法。您只需负责处理控制器的委托方法中的某些代码,因为您已将其定义为将处理此方法的对象。
只需将委托视为将某些工作推迟到其他对象的一种方式(顺便说一句,这是一种设计模式)