2015-03-18 36 views
0

我有一個相當簡單的NSURLConnectionDelegate包裝類處理簡單的HTTP請求我的應用程序。iOS ARC最佳實踐火和忘記ASYNC包裝

當這些請求返回時,它們會調用我的主視圖控制器類中的後續委託方法來通知我結果是否成功。

如果我把一個發射後不管的做法在我的視圖控制器使用方法內這些包裝,像這樣:

- (void) Foo { 
    MySimpleRequest* request = [[MySimpleRequest alloc] initWithDelegate:self]; 
    [request send]; 
} 

只要Foo的退出,request似乎被清理通過ARC和後續的委託方法永遠不會被調用。

如果我將我的request指針移動到類級別,它會掛起併成功。

這是推薦的方法嗎?我是否必須讓成員變量保持每個請求,還是有一種方法可以在請求返回之前保持其生命週期一直活着?

回答

2

您可以使用塊從下載中返回數據,並讓下載器類成爲下載的委託,以便所有委託方法都可以包含在該類中。我使用一個處理NSURLConnection的類,並從didFailWithError或connectionDidFinishLoading:中調用完成塊。下載器類在塊被執行後被釋放。我這樣稱呼它從視圖控制器,

Downloader *dl = [Downloader new]; 
    NSURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.wswd.net/testdownloadfiles/20MB.zip"]] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:10]; 

    [dl downloadWithRequest:request completion:^(NSData *data, NSError *error) { 
     if (data) { 
      // do whatever you need to do with the raw data here 
      NSLog(@"got the data"); 
     }else{ 
      NSLog(@"%@",error); 
     } 
    }]; 
1

我寧願始終保留對請求的「外部」引用。如果你不想要這個,我認爲你可以在MySimpleRequest這個課堂裏爲自己創建一個有力的參考。

確保將其設置爲零,否則顯然會導致內存泄漏。