2

次の方法を使用して画像を読み込もうとしています。

まず、ディスクに既にイメージがあるかどうかを確認します。ある場合は、ディスクからイメージ データを取得してロードします。それ以外の場合は、サーバーからイメージを取得してディスクに書き込みます。サーバーにアクセスする必要はありません。

問題は、ディスクからの書き込みまたは読み取りがないように見えることです。2回目に画像をロードしたいときはいつでも、サーバーからそれらを読み込んでいて、NSLog(@"disk");決して呼び出されません。

誰かが何か考えを持っているなら、私は何が間違っているのかわかりませんか?

-(UIImage *)imageWith:(NSString *)imageName isPreview:(BOOL)preview
{
     //imageName is something like "56.jpg"

     NSString *mainOrPreview = @"Preview";
     if (!preview) {
         mainOrPreview = @"Main";
     }

     NSString *pathSuffix = [[@"Images" stringByAppendingPathComponent:mainOrPreview] stringByAppendingPathComponent:imageName];
     NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:pathSuffix];
     NSData *imageData = [NSData dataWithContentsOfFile:path];

     if (imageData) {
         NSLog(@"disk");
     }

     if (!imageData && [self connected]) {

          imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[serverURL stringByAppendingPathComponent: pathSuffix]]];

         if (imageData) {

             [imageData writeToFile:path atomically:YES];
         }

         NSLog(@"server");
     }

      return [UIImage imageWithData:imageData];
}
4

1 に答える 1

3

問題は、ディレクトリが を超えて存在しないことDocumentsです。したがって、ファイルを書き込もうとすると失敗します。NSError結果を確認できるように、パラメーターを持つファイル メソッドを使用することを常にお勧めします。

サーバーからイメージを実際に書き込むコードのみを更新する必要があります。

if (!imageData && [self connected]) {
    // This needs to be done in on a background thread!
    imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[serverURL stringByAppendingPathComponent: pathSuffix]]];

    if (imageData) {
        [[NSFileManager defaultManager] createDirectoryAtPath:[path stringByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:nil];
        [imageData writeToFile:path atomically:YES];
    }

    NSLog(@"server");
}
于 2013-05-19T02:27:31.507 に答える