簡體   English   中英

創建/調用Objective-C委托方法Objective-C

[英]Creating/Invoking Objective-C Delegate Methods Objective-C

我已經嘗試過以下問題: 代表如何工作 ,但我似乎仍未完全掌握。 我正在嘗試使用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];
}

我對- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag方法不熟悉,但是在iOS中使用委托是讓對象之間相互通信而不引入的非常常見的方式一些依賴。

這里有一些提示可以回答您的3個項目符號問題:

該代碼放在哪里?

最好的選擇是在您希望執行ReadData的控制器內或在appDelegate中

如何使它成為委托方法?

如果已在協議中定義此方法,則根據定義,該方法已經是委托方法。 您只需要使viewcontroller類符合此協議,並使您的控制器成為此方法的委托即可。

我如何調用此委托方法

您不調用委托方法。 您還有另一個屬於此CocoaAsyncSocket庫的對象,它將調用此委托方法。 您只需為控制器的委托方法處理一些代碼,因為您已將其定義為將處理此方法的對象。

只是將委托看作是將某些工作推遲到另一個對象的一種方式(順便說一句是設計模式)

要創建委托,您可以在頭文件中聲明該內容。 下面的例子。

//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的委托的類中,它將對其進行調用。 希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM