我尝试过这个问题: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。问题是,我不知道WHERE放这个方法(我有几个视图,有几个头/实现文件)。我希望这个方法是一个委托方法,但我不知道如何使它成为委托方法。我想从我的视图中调用此委托方法。
如果有人能解释:
我整天都被困在这一天,而且我要把它丢掉了。任何和所有的帮助非常感谢。非常感谢!
编辑:
这是前一个问题的桥梁,但我不认为这个问题与这个问题有太多关联。 Question
答案 0 :(得分:0)
感谢您的更新。现在更清楚了。 这是一些答案。如果不清楚,请告诉我。
- 我在哪里放这个代码? (什么文件等)
这是CocoaAsyncSocket
的委托方法。回到第一个问题,当你初始化它时,你将自己(你的appDelegate)设置为代表。
socket = [[AsyncSocket alloc] initWithDelegate:self];
这意味着,您将从另一个班级调用。这意味着这个方法应该在初始化对象的同一个类中(这里是socket
)并将其设置为委托。所以它保留在appDelegate
- 如何将其设为委托方法?
你没有。这是委托方法本身。
- 如何调用此委托方法?
你没有。另一个类(这里是AsyncSocket
)将调用它。
您现在可以询问,如何将数据传递给viewControllers
?
这取决于你的设计。调用此方法后,如果有连接,并且正在读取数据,则会根据您的设计将数据传递给其他视图控制器。一种方法是使用NSNotification
。 e.g。
// 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];
}
答案 1 :(得分:0)
我不熟悉- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
方法,但在iOS中使用委托是让对象在彼此之间进行通信而不引入某些依赖关系的常用方法。
以下是回答3个子弹问题的一些提示:
我在哪里放这个代码?
最好的选择是在您想要执行ReadData的控制器内或在appDelegate中
如何将此作为委托方法?
如果在协议中定义了此方法,则这已经是一个委托方法。您只需要让viewcontroller类符合此协议,并使控制器成为此方法的委托。
如何调用此委托方法
您不会调用委托方法。您有另一个属于此CocoaAsyncSocket库的对象,该库将调用此委托方法。您只需处理控制器的委托方法中的某些代码,因为您已将其定义为将处理此方法的对象。
只是看一个委托作为将某些工作推迟到另一个对象的方法(它是一种设计模式顺便说一句)
答案 2 :(得分: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时,您可以将delegate
设置为自我。现在在SomeClass文件中,您可以执行
[self.delegate onSocket: .. didReadData: .. withTag:];
如果该方法存在于您设置为SomeClass的委托的类中,它将调用它。希望这会有所帮助。