0

NSURLConnection を使用してリモートサーバーから関連する画像を受信するために使用する URL の配列があります

NSURL *url = [NSURL URLWithString:URLString];
        NSMutableURLRequest *urlRequest = [NSMutableURLRequest
                                           requestWithURL:url
                                            cachePolicy:NSURLRequestUseProtocolCachePolicy
                                           timeoutInterval:2.0f];
            // Run network request asynchronously
        NSURLConnection *urlConnection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];

委任プロトコルで

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
   // As chuncks of the image are received, we build our data file
    [self.imageData appendData:data];
}

そして最後に

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
// All data has been downloaded, now we can set the image in the images array
_img = [UIImage imageWithData:self.imageData];
[self.imagesArray insertObject:_img atIndex:_index];
[self.imageData setLength:0];
_index = _index+ 1;
}

しかし、受信した順序は、URLリクエストを送信した順序と常に同じではありません。インスタンス変数インデックスを使用して、これらの画像を画像配列に同じ順序で挿入しようとしましたが、常に機能するとは限らず、まだ順序付けられていないリストを取得しています。これを達成する方法について、誰かが私を正しい方向に向けることができますか。

4

2 に答える 2

1

私自身の実装で行ったことは、画像データその元の URL の両方RemoteImageObjectを含む可変配列 (" " と呼びましょう)に挿入するカスタム Objective-C オブジェクトを作成することです。

あなたがすることは、リクエストを作成し、RemoteImageObject を作成して URL を追加し、それを配列に追加することです。

リクエストが画像データで返ってきたとき。配列で RemoteImageObject を検索し、画像データを追加します。

画像データを表示したい場合は、それらの RemoteImageObject ごとに imageData をフェッチするだけです。

理にかなっていますか?

于 2013-10-06T21:22:56.380 に答える
0

In general if I am downloading images I rely on the excellent AFNetworking classes. http://afnetworking.com This provides the overall behavior you are looking for (one takes a UIImageView, and default image, another will just deliver the image bytes)

If there is a reason that you MUST make your own, then I would have a dictionary of download name to NSURLConnection. This will allow you to then figure out which download has ASYNCHRONOUSLY completed, and act correctly on it.

If you really mean a SYNCHRONOUS delivery of download objects, then dispatch them one at a time, wait for the response, and then start the next on completion.

于 2013-10-06T21:37:36.513 に答える