0

別のスレッド(viewWillAppear内)にいくつかのflickr写真をダウンロードするためにキューをディスパッチしています。ブロック内の配列の内容をログに記録すると、すべてが完全に表示されます。

    dispatch_queue_t photoDowonload=dispatch_queue_create("photoDownload", NULL);
dispatch_async(photoDowonload, ^{

    NSArray *photoList=[FlickrFetcher topPlaces]; //downloads flickr data
    self.listOfCities=photoList;
    NSLog(@"inside block: %@", self.listOfCities); //shows contents

});

しかし、ブロックの外側のブロックの内側に設定された配列をログに記録しようとすると、nullが返されます。

    dispatch_queue_t photoDowonload=dispatch_queue_create("photoDownload", NULL);
dispatch_async(photoDowonload, ^{

    NSArray *photoList=[FlickrFetcher topPlaces];
    self.listOfCities=photoList;

});

    NSLog(@"after block: %@", self.listOfCities); //returns null

ここでの問題は何ですか?self.listOfCitiesはNSArrayプロパティとして設定されているため、ブロックに設定すると、その外部からアクセスできるようになります。

4

3 に答える 3

3

ブロック内のコードは非同期で実行されます。したがって、ブロック内のコードが実行される(または少なくとも確実に完了する)前に、ブロックが実行された後のコード。

于 2012-11-12T19:25:26.783 に答える
0

私はObjective-cの学習を始めたばかりで、ある種の問題については盲目になる可能性がありますが、上記のコードブロックの実行に対する_dispatch_asynch_の影響は何か疑問に思っています。ドキュメントによると

dispatch_async()およびdispatch_sync()関数は、ディスパッチフレームワーク内での同時実行のためにブロックをスケジュールします。

コードブロックの実行前にNSLogが呼び出され、変数がまだ初期化されていない可能性があります。

@rmaddyあなたは速かった。

于 2012-11-12T19:34:33.483 に答える
0

わかりました、これを理解しました。私の目標は、ブロックによって返された情報でtableViewを更新することでした。

ブロックの実行により配列変数が変更されていましたが、その変更は表示されませんでした。

秘訣は、次のようにアレイのゲッターでこの変更を検出することでした。

-(void) setListOfCities:(NSArray *)listOfCities
{
    if (_listOfCities!=listOfCities)
    {
        _listOfCities=listOfCities;
        [self.tableView reloadData]; //<-- reloads table after change
    }
}
于 2012-11-12T19:38:48.250 に答える