-1

リモートサーバー上の複数のソースからの複数のJSONオブジェクトを解析する必要があり、UITableViewに単一の解析の各値を入力する必要があります。

単一のJSONソース、例:h ** p://WWW.REMOTESERVERWITHJSONSOURCE.NET/A1:

{
  "id": 0001,
  "main": {
    "mainA": 100,
  },
}

単一のJSONソース、例:h ** p://WWW.REMOTESERVERWITHJSONSOURCE.NET/A2:

{
  "id": 0002,
  "main": {
    "mainA": 200,
  },
}

単一のJSONソース、例:h ** p://WWW.REMOTESERVERWITHJSONSOURCE.NET/A3:

{
  "id": 0003,
  "main": {
    "mainA": 300,
  },
}

ここでは、単一のURLを含む配列を割り当てて初期化します。

    - (void)viewDidLoad {

        // other stuff

        arrayA = [[NSMutableArray alloc] initWithObjects:@"A1", @"A2", @"A3", nil]; //each object A1, A2...An is the single subdirectory of URL for JSON source I need to parse
    }

解析方法:

- (void)LoadParse { // this method is called by a UIButton

        main = [[NSMutableArray alloc] init];

        for (int i=0; i < [arrayA count]; i++) {

            NSURL *url = [NSURL URLWithString:
                          [NSString stringWithFormat:
                           @"http://WWW.REMOTESERVERWITHJSONSOURCE.NET/%@",[arrayA objectAtIndex:i]]];

            NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:5.0];

            AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {

            NSMutableDictionary *arrayMain = [JSON valueForKey:@"main"];
            [mainA addObject:[arrayMain objectForKey:@"mainA"]];

            NSLog(@"%@",mainA);

            [table reloadData]; // mainA objects populates rows of UITableView
            [table scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];

            }

            failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON){

            }];

            [operation start];

            }
    }

NSLog(@ "%@"、mainA);の結果

1st parsing -> NSLog result = random (100-200-300 or 100-300-200 or 200-300-100 or 200-100-300 or 300-200-100 or 300-100-200)
2nd parsing -> (after a few seconds) NSLog result = random (100-200-300 or 100-300-200 or 200-300-100 or 200-100-300 or 300-200-100 or 300-100-200)
3rd parsing -> (after other few seconds) NSLog result = random (100-200-300 or 100-300-200 or 200-300-100 or 200-100-300 or 300-200-100 or 300-100-200)
...

エラー:UIButtonを押して解析を開始するたびに確認できるように、mainAオブジェクトの異なるシーケンス(次にテーブル行)を取得します。例:最初の解析後、何を期待しますか?100-200-300 ..代わりに、100-300-200または300-200-100などを取得します。したがって、次の解析では、parseMethodをロードするたびに、mainAのランダムシーケンスを取得します。 REMOTEサーバー上でA1-A2-A3mainAオブジェクトがそれぞれ100-200-300であることを保証できます。だから、あなたは私を助けることができます、ここで何が悪いのですか?頭がおかしい、ありがとう!

4

1 に答える 1

4

ループを進めるたびに、サーバーに非同期リクエストを発行します。各リクエストには、結果がWebサーバーから戻ってきたときに実行される完了ブロックがありますが、これらは非同期であるため、実行される順序がわかりません(サーバーの応答が最初に到着した方が、完了ブロックで最初に処理されます)。 。

これを修正するには、宣言時に配列を事前に入力します。

    main = [@[@"A",@"B",@"C"] mutableCopy];

次に、ループ内で、各応答を配列内のそれぞれの位置に割り当てることができます。

        [main replaceObjectAtIndex:i withObject:[arrayMain objectForKey:@"mainA"]];

配列の既存の長さよりも大きいインデックスでオブジェクトを追加することはできないため、配列を事前に入力する必要があります。

編集私はあなたのコードのarrayA(あなたが事前入力する)、、、とmainの間の関係を明確にしていませんがmainA、あなたは原則を得ることができると確信しています。

于 2013-01-30T18:28:51.593 に答える