문제

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를 통합하고 사용하는 것이 얼마나 쉬운지를 보여줍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top