1

iPad 3 4G テスト デバイスで URL から画像を取得するのに問題があります。コードは ipad 1 と 2 で動作し、iphone 3gs と iphone 4 でも動作します。しかし、その画像はnilサーバーから要求されたときのようです。

問題は発生していませんが、クライアントから問題が報告されています...

問題は次のコードにあると思います

コード:

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.image.com/img_download/499441.jpg"]];
UIImage *thumbnail = [UIImage imageWithData:data];

このコードの URL は実際のものではありませんが、明確にするために正しいものです。

ありがとう!

4

2 に答える 2

1

いくつかの考え:

  1. エラーコードを報告するdataWithContentsOfURL:options:error:だけでなく、を使用することをお勧めします。dataWithContentsOfURLまたは、より多くの診断情報を提供する可能性NSURLConnectionのあるフレームワーク(例:AFNetworking?)を使用します。しかし、それdataWithContentsOfURL:options:error:が必要なエラー情報を提供できるのではないかと思います。

  2. これをコンテキストに配置できますか?たとえば、これはアプリが非同期で実行していることですか(たとえば、テーブルビューのサムネイル)?その場合、許容される同時接続の数を超えないようにするために、グローバルディスパッチキューではなくNSOperationQueue適度に小さいものを使用していますか?maxConcurrentOperationCount

    たとえば、テーブルビューを次のように更新する場合:

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"image.com/img_download/499441.jpg"]];
        UIImage *thumbnail = [UIImage imageWithData:data];
    
        // presumably you're updating your UI like so
        dispatch_async(dispatch_get_main_queue(), ^{
            // update UI
        });
    });
    

    次のことを行う必要があります。まず、クラスプロパティを定義します。

    @property (nonatomic, strong) NSOperationQueue *queue;
    

    次に、でこれを初期化しviewDidLoad、許容できる同時操作の数を指定する必要があります。

    self.queue = [[NSOperationQueue alloc] init];
    self.queue.maxConcurrentOperationCount = 4;
    

    そして最後に、次のように置き換えdispatch_asyncます。

    [self.queue addOperationWithBlock:^{
        NSError *error = nil;
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"image.com/img_download/499441.jpg"]
                                             options:0
                                               error:&error];
    
        if (error)
        {
            // log or display what the error is
        }
        else
        {
            UIImage *thumbnail = [UIImage imageWithData:data];
    
            if (thumbnail)
            {
                // update UI in the main queue
    
                [[NSOperationQueue mainQueue] addOperationWithBlock:^{
    
                    // make sure the cell is still visible
    
                    UITableViewCell *updateCell = [tableView cellForRowAtIndexPath:indexPath];
    
                    // if so, update the image
    
                    if (updateCell)
                    {
                        updateCell.imageView.image = thumbnail;
                    }
                }];
            }
        }
    }];
    

    すでにダウンロードした画像の再読み込みを排除するために、キャッシュを実行することもできます。例については、 https://stackoverflow.com/a/14444605/1271826を参照してください。セッション間で画像をキャッシュする場合は、画像をフォルダにキャッシュすることもできDocumentsます(ただし、画像の変更を判断するには注意が必要です)。

2つ目のポイントとして、接続の問題は特定の回線の障害が原因ではなく、より広範な問題の兆候である場合があります。そのため、質問でコードをどのように使用しているかについて、もう少し情報が必要です。

于 2013-01-24T07:12:29.940 に答える
0

プロジェクトに Base64 クラス www.imthi.com/wp-content/uploads/2010/08/base64.zip を追加します。次のようにエンコードします。

NSData* data = UIImageJPEGRepresentation(yourImage, 1.0f);
[Base64 initialize];
NSString *strEncoded = [Base64 encode:data];

次のようにデコードします。

[Base64 initialize]; 
NSData* data = [Base64 decode:strEncoded ];;
image.image = [UIImage imageWithData:data];
于 2013-01-24T06:59:54.023 に答える