[Iphone] UIprogressView 업데이트 다운로드 진행 상태 확인


Answers

당신이하고있는 일은 "동기식"요청을 보내는 것입니다. 즉, HTTP 응답을 다운로드하는 스레드는 모든 데이터를 가져올 때까지 중단됩니다. 다운로드 진행 상황에 대한 표시기를 표시하지 않으려는 경우에도 UI 스레드에서이 작업을 수행하는 것이 바람직하지 않습니다. NSURLConnection 클래스를 사용하고, 델리게이트를 설정하고, 델리게이트 메소드에 응답하는 것이 좋습니다. 이에 대한 작은 자습서는 http://snippets.aktagon.com/snippets/350-HOW-to-make-asynchronous-HTTP-requests-with-NSURLConnection 에서 찾을 수 있습니다.

연결의 대리인이되면 연결에서 응답을받을 때 콘텐츠 길이를 얻을 수 있습니다.

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *)response;   
    contentSize = [httpResponse expectedContentLength];
}

그런 다음 새 데이터가 도착할 때마다 다운로드의 총 진행률을 계산하려면 다음과 같이하십시오.

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    // download data is our global NSMutableData object that contains the
    // fetched HTTP data.
    [downloadData appendData:data];
    float progress = (float)[downloadData length] / (float)contentSize;
    [progressView setValue:progress];
}

최신 정보:

Foundation과 비동기 HTTP를 수행하는 방법에 대한 또 다른 예 : http://codewithchris.com/tutorial-how-to-use-ios-nsurlconnection-by-example/

Question

내 응용 프로그램은 인터넷에서 비디오를 다운로드하고 iPhone에 저장합니다.

나는이 코드를 사용하고있다.

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];

[request setHTTPMethod:@"GET"];
NSError *error;
NSURLResponse *response;


NSString *documentFolderPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *videosFolderPath = [documentFolderPath stringByAppendingPathComponent:@"videos"]; 

//Check if the videos folder already exists, if not, create it!!!
BOOL isDir;
if (([fileManager fileExistsAtPath:videosFolderPath isDirectory:&isDir] && isDir) == FALSE) {
    [[NSFileManager defaultManager] createDirectoryAtPath:videosFolderPath withIntermediateDirectories:YES attributes:nil error:nil];
}

NSString *filePath = [videosFolderPath stringByAppendingPathComponent:@"name.mp4"];

if ([fileManager fileExistsAtPath:filePath ] == YES) {
    NSLog (@"File exists");
}
else {
    NSLog (@"File not found");
    NSData *urlData;
    NSString *downloadPath = @"http://www.mywebsite.com/name.mp4";
    [request setURL:[NSURL URLWithString:downloadPath]];
    urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

    BOOL written = [urlData writeToFile:filePath atomically:NO];
    if (written)
        NSLog(@"Saved to file: %@", filePath);
    else {NSLog(@"problem");}
}

모두 정상적으로 작동하지만 진행 상태보기를 추가하여 다운로드 상태를 나타냅니다.

문제 (나는 생각하지만 확실하지 않다)는 NSURLConnection 자체가 대리자가 아니기 때문에

- (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)data 

또는

-(void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite{

절대로 불리지 않는다.

나는 사용하려고 시도했다.

urlData = [[NSURLConnection alloc] initWithRequest:request delegate:self];

하지만 파일을 쓰려고하면 응용 프로그램이 충돌합니다.

[urlData writeToFile:filePath atomically:NO];

내가 무엇을 할 수 있을지? 감사




여기에서 동기 요청을 사용 중입니다.

이 문서에서는 다음과 같이 설명합니다. - 동기로드는 클래스에서 사용할 수있는 비동기로드 코드 위에 작성됩니다. 비동기 적재 시스템이이로드 요청을 위해 특별히 생성 된 스레드에 대한 URL로드를 수행하는 동안 호출 스레드가 차단됩니다. 동기로드를 수행하기 위해 호출 스레드에서 특별한 스레딩 또는 실행 루프 구성이 필요하지 않습니다.

여기에 클래스 참조를 참조 하십시오.

클래스 참조를 읽은 후에는 비동기 요청을 보내거나 요청을 초기화하고, 대리자를 설정하고, 시작할 수 있습니다.