我剛剛更新到AFNetworking 2.0,我重新寫我的代碼來下載數據&其插入到核心數據。隊列AFHTTPRequestOperations創造記憶積累的
我下載JSON數據文件(從10-200mb文件的任何地方),並將其寫入磁盤,然後傳遞了他們對後臺線程來處理數據。下面是下載JSON &將代碼寫入磁盤的代碼。如果我讓它運行(甚至不處理數據),應用程序會使用內存直到它被殺死。
我認爲作爲數據進來,它被存儲在內存中,但一旦我保存到磁盤它爲什麼會留在記憶?不應該autorelease池照顧這個?我還設置了響應數據,並將downloadData設置爲零。有明顯的證據表明我在這裏做錯了嗎?
@autoreleasepool
{
for(int i = 1; i <= totalPages; i++)
{
NSString *path = ....
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:path]];
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
op.responseSerializer =[AFJSONResponseSerializer serializer];
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
{
//convert dictionary to data
NSData *downloadData = [NSKeyedArchiver archivedDataWithRootObject:responseObject];
//save to disk
NSError *saveError = nil;
if (![fileManager fileExistsAtPath:targetPath isDirectory:false])
{
[downloadData writeToFile:targetPath options:NSDataWritingAtomic error:&saveError];
if (saveError != nil)
{
NSLog(@"Download save failed! Error: %@", [saveError description]);
}
}
responseObject = nil;
downloadData = nil;
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
DLog(@"Error: %@", error);
}];
}
[mutableOperations addObject:op];
}
NSArray *operations = [AFURLConnectionOperation batchOfRequestOperations:mutableOperations progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) {
DLog(@"%lu of %lu complete", (unsigned long)numberOfFinishedOperations, (unsigned long)totalNumberOfOperations);
} completionBlock:^(NSArray *operations) {
DLog(@"All operations in batch complete");
}];
mutableOperations = nil;
[manager.operationQueue addOperations:operations waitUntilFinished:NO];
謝謝!
編輯#1 我的完整塊中添加一個@autoreleasepool
似乎減緩內存使用了一點,但它仍然積聚並最終崩潰的應用程序。
感謝您的信息。在AFNetworking 2.0之前,我做了NSOperation的子類,並使用NSURLConnection來處理下載。 (雖然,當我完成下載時,我仍然將它保存到磁盤)。這樣做,我的記憶從來沒有超過50MB,這就是爲什麼我很困惑。我將嘗試使用AFNetworking實現NSURLSessionDownloadTask,以查看是否有幫助。謝謝! – RyanG
我最終更新了舊的NSOperation子類,以便有效地工作。我沒有看到如此巨大的內存堆積。 – RyanG