0

私はiOSでのWebサービスの呼び出しとスレッド化が初めてです。ViewControllerテーブルビュー コントロールを含むアプリを持っています。JSON Web サービスを介して取得したデータをテーブルに入力しています。JSON Web サービスは独自のスレッドで呼び出され、その間にNSArrayand を設定していNSDictionaryます。

配列内に完全に入力NSLogされているにもかかわらず、ステートメントが配列カウントに対してゼロを返すため、配列と辞書が範囲外になっているようです。fetchedData

私の配列と辞書オブジェクトがスレッドの外で空である理由について、誰かが説明を提供できますか?


- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *serviceEndpoint = [NSString stringWithFormat:
                                 @"http://10.0.1.12:8888/platform/services/_login.php?un=%@&pw=%@&ref=%@",
                                 [self incomingUsername], [self incomingPassword], @"cons"];
    NSURL *url = [NSURL URLWithString:serviceEndpoint];
    dispatch_async(kBgAdsQueue, ^{
        NSData *data = [NSData dataWithContentsOfURL:url];
        [self performSelectorOnMainThread:@selector(fetchedData:) withObject:data waitUntilDone:YES];
    });

    NSLog(@"ARRAY COUNT: %d\n", [jsonArray count]);
}

-(void)fetchedData:(NSData*)responseData{
    NSError *error;
    jsonDict = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
    jsonArray = [[jsonDict allKeys]sortedArrayUsingSelector:@selector(compare:)];
    for(NSString *s in jsonArray){
        NSLog(@"%@ = %@\n", s, [jsonDict objectForKey:s]);
    }
}
4

3 に答える 3

0

データが入力される前に、jsonArray 要素の数を出力しようとしています。何が起こるかは次のとおりです。

  1. URLを用意する
  2. 日付を取得するために新しいスレッドを作成します。このスレッドの実行には時間がかかる場合があります (接続速度とデータ量によって異なります)。
  3. スレッドの実行中に jsonArray にアクセスしており、fetchedData: が呼び出されていません

また、提案: dataWithContentsOfURL: メソッドを使用しないでください。AFNetworking などのネットワーク フレームワークを調べてみてください。

于 2013-04-23T13:47:25.387 に答える
0

を使用するdispatch_asyncと、そのコードはブロックされません。これは、配列カウントログステートメントfetchedDataが呼び出される前にトリガーされることを意味するため、辞書と配列はまだ空です。ログ ステートメントの順序を見てください。ディクショナリをログに記録する前に、配列の数が表示されるはずです。

// Executes on another thread. ViewDidLoad will continue to run.
dispatch_async(kBgAdsQueue, ^{
    NSData *data = [NSData dataWithContentsOfURL:url];
    [self performSelectorOnMainThread:@selector(fetchedData:) withObject:data waitUntilDone:YES];
});

// Executes before the other thread has finished fetching the data. Objects are empty.
NSLog(@"ARRAY COUNT: %d\n", [jsonArray count]);

TableViewデータが返された後 (つまり で)、データの入力を終了する必要がありますFetchData:

于 2013-04-23T13:45:11.567 に答える
0

viewDidLoad 内のログ ステートメントは、その時点でデータが取り込まれていないため、配列が空であることを報告する必要があります。dispatch_async を呼び出すと、そのコード ブロックが非同期で実行され、ブロックが完了する前に viewDidLoad 関数を終了させることができます。そのため、viewDidLoad の最後にある配列には何もありません。

于 2013-04-23T13:45:37.223 に答える