2016-06-17 2 views
4

Dropbox에서 파일을 다운로드하는 것을 포함하는 응용 프로그램을 구현하려고합니다. CloudRail을 수행하는 간단한 프레임 워크가있는 것처럼 보입니다. ,CloudRail을 사용한 간단한 다운로드

self.dropboxInstance = [[Dropbox alloc] initWithClientId:self.authDic[@“————“] clientSecret:self.authDic[@“————“]]; 
    id returnObject = [self.dropboxInstance downloadWithFilePath:@“/pictures/001.png“]; 

UIImage * image = [UIImage imageWithData:object]; // CRASH HERE 

내가 엑스 코드 도구를 통해 네트워크와 디스크 활동을 확인하고 다운로드가 제대로 수행 :하지만 코드는 내가 (이 경우 이미지)를 다운로드 한 파일로 작업 할 때 여기에, 충돌의 예입니다 그래서 나는 그것이 다운로드 기능의 반환과 관련이 있다고 믿습니다.

답변

5

우선, 메서드의 반환 유형은 다운로드 한 파일의 내용을 읽는 데 사용할 수있는 NSInputStream입니다.

코드가 작동하지 않는 이유는 NSData 형식으로 처리하기 때문입니다.

따라서 해결책은 리턴으로받은 스트림에서 모든 컨텐츠를 먼저 읽고 NSData 오브젝트에 저장 한 다음 데이터에서 UIImage를 작성하는 것입니다.

self.dropboxInstance = [[Dropbox alloc] initWithClientId:self.authDic[@“————“] clientSecret:self.authDic[@“————“]]; 
    id returnObject = [self.dropboxInstance downloadWithFilePath:@“/pictures/001.png“]; 

    //NEW CODE 
    NSInputStream * inputStream = returnObject; 

    [inputStream open]; 
    NSInteger result; 
    uint8_t buffer[1024]; // buffer of 1kB 
    while((result = [inputStream read:buffer maxLength:1024]) != 0) { 
    if(result > 0) { 
     // buffer contains result bytes of data to be handled 
     [data appendBytes:buffer length:result]; 
    } else { 
     // The stream had an error. You can get an NSError object using [iStream streamError] 
     if (result<0) { 
     [NSException raise:@"STREAM_ERROR" format:@"%@", [inputStream streamError]]; 
     } 
    } 
    } 
    //END NEWCODE 

    UIImage * image = [UIImage imageWithData:data]; // NO CRASH ANYMORE :) 

위의 코드는 절차 적 방법으로 스트림에서 읽는 데 사용됩니다 (스레드를 차단 함). 스트림에서 비동기 적으로 읽으려면이 다른 대답 (Stream to Get Data - NSInputStream)을 참조하십시오. 희망이 도움이되었습니다.

관련 문제