2010-08-19 23 views
0

如何創建一個包含它自己的委託的新文件,以便我可以創建一個ASIHTTPRequest以及它自己的異步結束,以及足夠簡單的事情,我只需要將[request setDelegate:self];設置爲[request setDelegate:AlternateDelegate];之類的東西,並且只需在開始時添加一個include的文檔來引用AlternateDelegate委託ASIHTTPRequest異步的另一個代表?

+0

我真的不明白你在問什麼 - 你問如何創建一個新的目標C類? – JosephH 2010-08-19 09:41:16

+0

只是想爲文件創建另一個委託。 – 2010-08-19 16:00:33

回答

1

我知道這個問題是舊的,但如果有人遇到它:

@Hankweb seemes在談論使用請求作爲自己的代表。這當然有一些情況。例如,我正在開發一個項目,該項目使用ASIHTTPRequest從遠程源獲取JSON並將其導入到Core Data存儲中。

此操作(字面上,ASIHTTPRequestNSOperation的子類)幾乎完全自包含;我在後臺線程上使用流式JSON解析器將對象導入到NSManagedObjectContext中進行自定義請求,該對象在保存時觸發一條內部捕獲的通知,並使用performSelectorOnMainThread:waitUntilDone:傳遞到主線程的上下文。

我正在使用ASIHTTPRequest的塊支持來完成此操作;在我的自定義initWithURL:方法中,我設置了相關回調(dataReceivedBlock,completionBlockfailureBlock等)。不過,傳統的委託模式(使用ASIHTTPRequestDelegate協議)也應該可行。

一個問題:你應該確保請求不會自己保留太多時間,否則你最終會發生內存泄漏。當使用多線程時,這很容易錯過,特別是在使用塊時。相反的:

- (id)initWithURL:(NSURL *aURL) { 
    //... 
    [self setCompletionBlock:^{ 
    [self doSomething]; 
    }]; 
    //... 
    return self; 
} 

引用塊內self時使用__weak屬性(或__block如果使用ARC是):

- (id)initWithURL:(NSURL *aURL) { 
    //... 
    __weak id blockSelf = self; 
    [self setCompletionBlock:^{ 
    [blockSelf doSomething]; 
    }]; 
    //... 
    return self; 
} 

如果你不知道這是爲什麼重要的是,請務必閱讀Apple's guide to blocks in Objective-CASIHTTPRequest block API documentation

1

ASIHTTPRequest的委託只是一個標準的目標C對象。只需創建一個新類,包含它的標題,創建/獲取對象並將委託設置爲該對象。

你有沒有試過這個,並遇到問題?如果是這樣的問題是什麼?