1

私はサーバーを持っていて、その応答を受け取ります:

 {"products": [
    {
      "product_id": "1170",
      "name": "zzzz®",
      "sort_order": 0,
      "brand": "zzzas",
      "product_category_id": "1090",
      "location_ids": [
        "1078"
      ],
      "icon_url": "http://zzzzz.com/media/2502/zzzz.png",
      "icon_date": "Wed, 07 Nov 2012 14:03:47 GMT",
      "thumbnail_url": "http://zzzz.com/media/2591/zzdfs.png",
      "thumbnail_date": "Wed, 07 Nov 2012 14:04:02 GMT"
    },
    {
      "product_id": "1126",
      "name": "ddddd®",
      "sort_order": 1,
      "brand": "dddsas",
      "product_category_id": "1110",
      "location_ids": [
        "1095"
      ],
      "icon_url": "http://zzzzz.com/media/2507/ddddd.png",
      "icon_date": "Wed, 07 Nov 2012 14:03:48 GMT",
      "thumbnail_url": "http://zzzzz.com/media/2596/sssds.png",
      "thumbnail_date": "Wed, 07 Nov 2012 14:04:05 GMT"
    }
]}

そのコードを使用して JSON を解析しています

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"link"]]; AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {

NSDictionary *jsonDict = (NSDictionary *) JSON;
   NSArray *products = [jsonDict objectForKey:@"products"];
  [products enumerateObjectsUsingBlock:^(id obj,NSUInteger idx, BOOL *stop){
    NSString *productIconUrl = [obj objectForKey:@"icon_url"];
}];
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { NSLog(@"Request Failure Because %@",[error userInfo]); }];

[operation start];

すべての icon_urls を取得し、シリアル化されたダウンロードのために AFnetworking キューに割り当てるにはどうすればよいですか。一部のファイルは、応答のpdfまたはmp4ファイルでもあるため、それらすべてを要求として配列にパックし、1つずつダウンロードしてください。

AFClient を検索しましたが、ソース コードや使用例を見つけることができました。

4

2 に答える 2

3

プロジェクトでは MVC アーキテクチャに従う必要があります。あなたのjson形式によると、次のことがあなたへの私の提案です。

したがって、最初にモデル名「製品」を作成する必要があります。「製品」には、json データの iconUrl、productId、productName、thumnailURL などのプロパティが必要です。

そのため、以下の解析コードを見て、最初に製品リストを取得してください。

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL
URLWithString:@"link"]];  AFJSONRequestOperation *operation =
[AFJSONRequestOperation JSONRequestOperationWithRequest:request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON)
{

    NSDictionary *jsonDict = (NSDictionary *) JSON;    
    NSArray *products = [jsonDict objectForKey:@"products"];

    NSMutableArray *productsList = [[NSMutableArray alloc] init];
    Product *product = [[Product alloc] init];

    [products enumerateObjectsUsingBlock:^(id obj,NSUInteger idx, BOOL *stop){
        product.icon_url= [obj objectForKey:@"icon_url"];
        [productsList addObject:product];
    }]; 

} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON { 
    NSLog(@"Request Failure Because %@",[error userInfo]); 
}];

[operation start];

これで完全な製品リストができました。次に、次のコードを使用してリストを反復し、画像データをダウンロードします。

NSData *imageData = [NSData dataWithContentsOfURL:
                            [NSURL URLWithString:product.iconUrl]];
于 2012-11-21T07:15:36.887 に答える
2

それを使用して JSON をループし、各 URL にアクセスして、それぞれの非同期ダウンロードを追加できるはずです。

for ループを使用すると簡単に実行できます。

for (NSDictionary *dict in [jsonDict objectForKey:@"products"]) {
    NSURL *fileURL = [NSURL URLWithString:[dict valueForKey:@"icon_url"];
    // Some code to start the download.
}

AFNetworking の Github ページでこの例を見てみたいと思います。

ここAFHTTPRequestOperationに記載されているドキュメントを使用して、ダウンロードをセットアップできるはずです。

リクエストを設定するには、次のようにします。

NSURL *baseURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@://%@", u.scheme, u.host]];
AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:baseURL];
NSString *path = [url stringByReplacingOccurrencesOfString:s withString:@""];
NSURLRequest *request = [client requestWithMethod:@"GET" path:path parameters:nil];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    // Do success stuff
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    // Do fail stuff
}];
[operation start];

これのいくつかを最適化する方法があるかもしれませんが、それが一般的な考え方です。

于 2012-11-20T18:37:34.110 に答える