2010-11-06 191 views
0
NSURL *URL = [NSURL URLWithString:@"http://www.stackoverflow.com"]; 
NSURLRequest *request = [NSURLRequest requestWithURL:URL]; 
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; 

代碼非常簡單,我可以在我的應用程序中加載一個網頁。我不必擔心保留或釋放NSURLConnection,它會在加載完成時自動釋放。如何創建類似NSURLConnection的東西?

我創建了一些NSURLConnection,JSONConnection的包裝。它允許我從網頁加載JSON值並自動在NSDictionary中解析該值。現在,我不得不使用它是這樣的:

JSONConnection *tempJSONConnection = [[JSONConnection alloc] initWithURLString:@"http://www.stackoverflow.com" delegate:self]; 
self.JSONConnection = tempJSONConnection; 
[tempJSONConnection release]; 

然後,當它完成加載,我打電話self.JSONConnection = nil;

我想要什麼,是要做到這一點:

JSONConnection *connection = [JSONConnection connectionWithURLString:@"http://www.stackoverflow.com" delegate:self]; 

我知道如何創建此方法。我只是不知道如何保持connection在runloop結束並且自動釋放池耗盡時保持活動狀態,並且確保connection在完成加載後解除分配。換句話說,我不怎麼重複NSURLConnection的確切行爲。

+0

只是一個歷史性的筆記。多年來,這是傳統上與http://allseeing-i.com/ASIHTTPRequest/!但是多年以來(從2012年左右起),圖書館已經消失。它是那裏最好的圖書館之一,爲這個行業提供了很好的服務。 – Fattie 2016-03-10 21:22:21

回答

2

所有意圖和目的,從外觀看,NSURLConnection的有效保留本身。這是或者通過在完成時開始連接時,然後

[self release]; 

發送

[self retain]; 

並通知委託後進行;或者是通過將自己置於當前開放的連接池中並在完成時將其從池中移除來完成。

你實際上不需要做任何這些。 NSURLConnection保留它的委託,所以你的JSON連接類應該創建一個NSURLConnection作爲NSURLConnection的委託來傳遞它自己。這樣它至少可以和NSURLConnection一樣長。它應該將JSON解析爲方法-connectionDidFinishLoading:中的字典,並在返回之前將該字典傳遞給它的委託。在返回之後,NSURLConnection將釋放並可能釋放自己並釋放您的JSON連接。

0

有人應該在任何情況下都會觸發連接的現場時間。在連接內部對其進行跟蹤是一種糟糕的解決方案。

國際海事組織做了正確的方法是使用單獨的類進行連接

@protocol JSONDataProviderDelegate <NSObject> 
- (void) JSONProvider:(JSONDataProvider*) provider didLoadJSON:(JSONObject*) object; 
- (void) JSONProvider:(JSONDataProvider*) provider didFainWithError:(NSError*) error; 
@end 

@interface JSONDataProvider : NSObject 

+ (void) provideJSON:(NSURL*) url delegate:(id<JSONDataProviderDelegate>) delegate; 
+ (void) removeDelegate:(id<JSONDataProviderDelegate>delegate); 

@end 

用法:

- (void) onSomeEvent 
{ 
    [JSONDataProvider provideJSON:[NSURL URLWithString:@"http://example.com/test.json"] delegate:self]; 
} 

- (void) JSONProvider:(JSONDataProvider*) provider didLoadJSON:(JSONObject*) object 
{ 
    NSLog(@"JSON loaded: %@", object); 
} 
- (void) dealloc 
{ 
    [JSONDataProvider removeDelegate:self]; 
    [super dealloc]; 
} 
+0

Singleton類是要走的路,使用CocoaWithLove中的「SynthesizeSingleton.h」http://projectswithlove.com/projects/SynthesizeSingleton.h.zip – Fattie 2010-11-06 19:28:29

相關問題