2013-10-02 103 views
1

我正在從UIGridViewCells下載電影文件。我的代碼是:使用AFNetworking下載多個文件時收到內存警告

NSMutableURLRequest* rq = [[APIClient sharedClient] requestWithMethod:@"GET" path:[[self item] downloadUrl] parameters:nil]; 
    [rq setTimeoutInterval:5000]; 
    _downloadOperation = [[AFHTTPRequestOperation alloc] initWithRequest:rq] ; 
    _downloadOperation.outputStream = [NSOutputStream outputStreamToFileAtPath:[[self item] localUrl] append:NO]; 
    __weak typeof(self) weakSelf = self; 
    [_downloadOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSLog(@"Successfully downloaded file to %@", [weakSelf.item localUrl]); 
     [Helper saveItemDownloaded:weakSelf.item.productId]; 
     weakSelf.isDownloading = NO; 
     [weakSelf.progressOverlayView removeFromSuperview]; 
     [weakSelf setUserInteractionEnabled:YES]; 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Error: %@", error); 
     [weakSelf.progressOverlayView removeFromSuperview]; 
     [weakSelf setUserInteractionEnabled:YES]; 
     weakSelf.isDownloading = NO; 
     }]; 
    [_downloadOperation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) { 
     float progress = totalBytesRead/(float)totalBytesExpectedToRead; 
     weakSelf.progressOverlayView.progress = progress; 
    }]; 
    [[NSOperationQueue mainQueue] addOperation:_downloadOperation]; 

而且在ItemCell的屬性是:

@property (nonatomic, retain) AFHTTPRequestOperation *downloadOperation; 

後1-2成功下載(20MB),我收到內存警告。每次下載都會增加內存使用量,下載完成後永遠不會降低。

enter image description here

從儀器:每個文件 enter image description here

+1

你在做這一切嗎? –

+0

對於下載操作,是的。但我發了一個列表來播放電影。 – Burak

回答

0

使用@autorelease下載:

for(File* file in fileList) 
{ 
    @autoreleasepool { 
     [self downloadFile:file]; 
    } 
} 

這將釋放所有變量和單獨的文件下載之間分配數據。

此外,你應該追查這些內存泄漏。我在儀器屏幕截圖中看到一些可見的。

+0

當我跟蹤內存泄漏時,我看不到任何與我的代碼有關的內容。我更新了我的問題,請檢查。 – Burak

2

我相信用AFNetworking下載文件的首選方法是設置「outputStream」屬性。

根據AFNetworking文檔:

,用於接收寫請求之前完成數據的輸出流。

默認情況下,數據會累積到一個緩衝區中,緩衝區在請求完成時存儲在responseData中。當設置了outputStream時,數據將不會累積到內部緩衝區中,因此完成的請求的responseData屬性將爲nil。輸出流將被設置在網絡線程runloop中。

我有同樣的問題

,通過使用「的OutputStream」解決了這個問題。