NSURLCONNECTION 위임 및 스레딩 - iPhone
-
06-07-2019 - |
문제
NSURLConnection을 통해 앱 문서 디렉토리의 두 개의 .plist 파일을 업데이트하는 클래스가 있습니다. 이 클래스는 nsurlconnection의 자체 대표 역할을합니다. 단일 파일을 요청하면 제대로 작동하지만 두 파일을 업데이트하려고 할 때 실패합니다. GetNewDatabase 메시지 각각에 대한 새 스레드를 시작 해야하는 것처럼 보입니까?
- (void)getAllNewDatabases {
[self performSelectorOnMainThread:@selector(getNewDatabase:) withObject:@"file1" waitUntilDone:YES];
[self performSelectorOnMainThread:@selector(getNewDatabase:) withObject:@"file2" waitUntilDone:YES];
}
- (BOOL)getNewDatabase:(NSString *)dbName
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSMutableString *apiString = [[NSMutableString alloc] initWithString:kAPIHost];
[apiString appendFormat:@"/%@.plist",dbName];
NSURLRequest *myRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:apiString] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
NSURLConnection *myConnection = [[NSURLConnection alloc] initWithRequest:myRequest delegate:self];
[apiString release];
if( myConnection )
{
//omitted for clarity here
}
[pool release];
}
//NSURLConnection delegate methods here ...
해결책
NsurlConnection과 Nsthread에서 흥미로운 것을 발견했습니다. 스레드는 호출하는 방법을 수행하는 데 시간이 오래 지속됩니다.
위의 경우 실은 getNewDatabase:(NSString *)dbName
완료하는 데 걸리기 때문에 실제로 무엇이든 할 시간을 갖기 전에 대의원 방법을 죽입니다.
나는 찾았다 이것 더 나은 설명과 문제에 대한 해결책을 제공하는 웹 사이트
주어진 시간 내에 완료되지 않으면 사용자 정의 시간을 가질 수 있도록 약간 조정했습니다 (누군가 액세스 포인트 사이를 걸을 때 편리합니다)
start = [NSDate dateWithTimeIntervalSinceNow:3];
while(!isFinished && [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:[NSDate distantFuture]]){
if([start compare:[NSDate date]] == NSOrderedAscending){
isFinished = YES;
}
}
다른 팁
현재 제공 한 코드에 서서 getNewDatabase:
응용 프로그램의 기본 스레드에서 실행 중입니다. 이 특별한 경우의 문제는 제임스가 그의 경우에 관찰 한 것처럼 실의 수명주기 이외의 것입니다.
백그라운드 에서이 작업을 수행하려는 경우 사용을 검토하는 것이 좋습니다. NSOperationQueue
그리고 NSOperation
현재 코드의 문제를 해결하는 대신. 나는 당신의 사건이 매우 적합하다고 생각합니다 NSOperationQueue
, 특히 수행 할 다운로드 작업이 둘 이상인 경우에.
Dave Dribin은 다음에 있습니다 훌륭한 기사 nsurlconnection과 같은 비동기 API 사용에 대해 NSOperation
. 또는 배경 스레드에서 실행되는 한 프로세스를 단순화하고 NSOperation에서 동기 API 메소드를 사용할 수도 있습니다. initWithContentsOfURL:
.
마커스 자라도 있습니다 튜토리얼을 작성했습니다 간단한 배경 작업에 NSOperationQueue를 통합하고 사용하는 것이 얼마나 쉬운지를 보여줍니다.