我開始developp iPhone應用程序,我需要對NSURLSession以及如何妥善管理自己的數據下載和解析一些建議。意見,以妥善管理NSURLSession
我只是完成校正在nsurlsession下載我的數據錯誤,但對於我發現怎麼難以理解這些asynchronus要求,我覺得我的解決方案是不是真的好... 還下載錯誤出現與2種不同的解決方案下載,這讓我覺得我忘了做點什麼...
在我的項目中,我下載不同的xml文件(和某些有圖片的zip文件),我需要解析之前顯示他們的信息。這些信息可以快速更改,所以如果我再次加載我的頁面,我想再次下載它們。 我正在尋找一種簡單的方法來以相同的方式管理所有的下載,就像我不必寫很多代碼一樣。
,我發現這個project第一。
就這樣,我不得不使用這些代碼來管理下載:
NSString *downloadUrl = @"https://www.url.com";
NSURL *location = [NSURL URLWithString:downloadUrl];
// DownloadManager is my version of the CTSessionOperation of the github project
DownloadManager *operation = [DownloadManager new];
operation.downloadUrl = downloadUrl;
operation.completionAction = ^(NSURL *xmlUrl, BOOL success){
dispatch_async(dispatch_get_main_queue(), ^{
if (success){
regions = [[TeamChoiceManager sharedManager] parseRegions:[NSData dataWithContentsOfURL:location]];
[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:Nil waitUntilDone:YES];
}
});
};
operation.isBackground = YES;
[operation enqueueOperation];
此代碼工作完美,我第一次下載。但是如果我嘗試再次啓動下載,則不會啓動下載(因此,沒有錯誤,只需下載一次代碼即可)。
我通過修改CTSessionOperation
/DownloadManager
中的metod (NSURLSession *)session
來更正此錯誤。我把評論的「dispatch_once」,使其工作,但我不認爲這是很好的解決方案......
我嘗試導致了同樣的錯誤的其他解決方案至極。我管理的下載與此代碼:
NSString *regionsUrl= @"url";
NSURLSessionConfiguration *sessionConfig =
[NSURLSessionConfiguration defaultSessionConfiguration];
// My solution to the bug
/*NSURLSessionConfiguration *backgroundConfiguration = [NSURLSessionConfiguration
backgroundSessionConfiguration:[NSString stringWithFormat:@"com.captech.mysupersession.BackgroundSession%d",numBGSession]]; */
// numBGSession++; this is a static NSInteger
NSURLSession *session =
[NSURLSession sessionWithConfiguration:backgroundConfiguration
delegate:teamChoiceDetailViewController
delegateQueue:nil];
NSURLSessionDownloadTask *sessDLTask =
[session downloadTaskWithURL:[NSURL URLWithString:regionsUrl]];
[sessDLTask resume];
,並在委託:
-(void)URLSession:(NSURLSession *)session
downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location
{
dispatch_async(dispatch_get_main_queue(), ^{
self.regions = [[TeamChoiceManager sharedManager] parseRegions:[NSData dataWithContentsOfURL:location]];
[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:Nil waitUntilDone:YES];
});
}
這個解決方案,我避免故障通過創建每次我嘗試下載時間自定義NSURLSessionConfiguration
。
所以在這裏我們去。我對這兩種解決方案非常混淆。我不知道他們是否來管理下載正確的方式,我不認爲我正確地糾正了這一錯誤,我一定錯過了與NSURLSession
邏輯的東西。
你有什麼建議來改善這些解決方案,或者你看到哪一個比另一個好得多?
感謝您的回答。通過工作非常好,我的意思是例如,如果我在tableViewController的viewDidLoad中使用此代碼,我將第一次有我的tableView充滿數據,但如果我在其他視圖中再次加載tableView,它將爲空(當enqueueOperation再次啓動時,它不會啓動下載)。 –
我使用NSURLSession只是因爲我不想在下載時凍結應用程序。所以我想第二個解決方案對我來說應該夠了。但我仍然覺得奇怪的是,創建一個不同的NSURLSessionConfiguration來糾正錯誤,這對我來說似乎不合邏輯。 –
@ user3282167我同意它的好奇,創建一個新的會話的作品。我可以想象的是,通過重新使用舊會話,新請求可能排在最初嘗試未完成的下載之後。所以我懷疑正確的答案是取消先前的請求,而不是創建一個新的會話與其他一整套請求。看到我修改後的答案。 – Rob