iphone 응용 프로그램을 개발하기 시작했으며 NSURLSession에 대한 조언과 내 데이터 다운로드 및 구문 분석을 올바르게 관리하는 방법에 대해 알아야합니다.NSURLSession을 올바르게 관리하기위한 조언
방금 nsurlsession에서 데이터 다운로드에 대한 버그를 수정했지만 이러한 비동기 요청을 이해하는 것이 얼마나 어려웠는지에 관해서는 내 솔루션이 실제로 좋지 않다고 생각합니다. 또한 다운로드 버그가 나타납니다. 다운로드의 2 가지 다른 솔루션으로, 내가 뭔가를 잊어 버린 것 같아요 ...
In, 내 프로젝트를 내가 다른 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
으로 수정하여이 버그를 해결하십시오. 나는 그것을 만들기 위해 "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
을 다운로드하려고 할 때마다를 작성하여 버그를 피할 수 있습니다.
여기 있습니다. 나는이 2 가지 솔루션과 상당히 혼동한다. 나는 그들이 다운로드를 관리하는 적절한 방법인지 모르겠다. 나는 올바르게 버그를 수정했다고 생각하지 않는다. 그리고 나는 NSURLSession
의 논리로 뭔가를 놓쳤음에 틀림 없다.
이 솔루션을 개선하기위한 조언이 있습니까? 아니면 다른 솔루션보다 훨씬 뛰어난 솔루션이 있습니까?
답장을 보내 주셔서 감사합니다. 완벽하게 작동합니다, 내가 예제를 의미, 만약 내가 tableViewController의 viewDidLoad 에서이 코드를 사용하여, 내 첫 번째 시간 내 tableView 전체 것입니다,하지만 내가 다른보기로 이동하고 다시 tableView를로드하면 비어 있어야합니다 (enqueueOperation이 다시 시작되면 다운로드를 시작하지 않습니다). –
NSURLSession은 다운로드 할 때 앱을 정지시키고 싶지 않기 때문에 사용합니다. 그래서 나는 제 2의 해결책이 나를 위해 충분해야한다고 생각합니다. 하지만 여전히 이상한 다른 NSURLSessionConfiguration 만들기 버그를 수정 찾으십시오, 그건 논리적 인 것 같습니다. –
@ user3282167 새로운 세션을 만드는 것이 효과적인지 궁금합니다. 상상할 수있는 것은 이전 세션을 다시 사용하면 새 요청이 초기 시도에서 보류중인 다운로드 백 로그의 뒤쪽에 대기하고있는 것입니다. 따라서 올바른 대답은 이전 요청을 취소하고 다른 모든 요청 집합을 사용하여 새 세션을 만드는 것이 아니라고 생각됩니다. 내 수정 된 답변을 참조하십시오. – Rob