2012-06-05 77 views
0

我試過了這個問題:How Does A Delegate Work,我似乎還沒有完全掌握它。我正在嘗試使用CocoaAsyncSocket庫來創建一個TCP套接字連接。由於從一個非常友好的用戶SO幫忙,我有以下的代碼來執行讀取數據請求到服務器:創建/調用Objective-C委託方法Objective-C

- (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

+0

只是爲了說明一下,你想調用這個方法,傳入參數,並獲取msg作爲返回值? – Canopus

+0

這是CocoaAsyncLibrary的一部分。我在上面編輯了我的問題,因爲這個問題與我的第一個問題有點相似。不過,我認爲我的第一個問題中的任何細節都不相關。 – Skizz

回答

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]; 
} 
+0

這是一個很好的描述。我現在明白這好多了。我在appDelegate中放置了方法onSocket:didReadData:withTag:method。我從readData中看不到任何內容,但這可能是因爲沒有數據準備從服務器端讀取(另一個人正在處理服務器端應用程序)。再次感謝您的幫助! – Skizz

+0

使用調試模式,我通過我的代碼,並意識到這種方法(onSocket:didReadData:withTag :)甚至沒有被調用。正如我所說,我所做的只是添加我的onSocket:didReadData:withTag:方法添加到我的appDelegate.m文件的底部。我不知道你是否使用Skype,但如果你是Skype用戶,可以通過CaffeineWakeUp聯繫我。看起來我真的很接近這個擺脫。謝謝! – Skizz

+0

通過一些挖掘,我想我能弄明白。我將繼續努力,如果我遇到麻煩,我會創建一個新問題。看起來我正在調用方法。再次感謝所有的幫助! – Skizz

0

我不熟悉- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag 方法,但在iOS中使用委託是非常有沒有引入一些依賴彼此之間的溝通對象常見的方式。

下面是一些提示,回答你的子彈3問題:

我在哪裏可以把這個代碼?

最好的辦法將要執行或在的appDelegate

如何使這個委託方法你READDATA控制器內?

如果此方法已在協議中定義,則此方法已按定義爲委託方法。你只需要讓你的viewcontroller類符合這個協議,並讓你的控制器成爲這個方法的代表。

如何調用該委託的方法

你不調用委託方法。你有一個屬於這個CocoaAsyncSocket庫的其他對象,它將調用這個委託方法。因爲您已將其定義爲將處理此方法的對象,因此您只需處理控制器的委託方法內的一些代碼。

只看到一個委託的方式來推遲一些工作的其他對象(這是BTW一種設計模式)

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的類存在,它會調用它。希望這可以幫助。