2016-06-17 8 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 

私は、Xcodeのツールを介してネットワークとディスクのアクティビティをチェックし、ダウンロードが正しく行われています私はそれがダウンロード機能の復帰と関係があると信じています。

答えて

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)を参照してください。これが助けてくれたらと思っています。

関連する問題