self.topPlaces
まず、次のようにスタブしてみてください。
dispatch_queue_t downloadQueue = dispatch_queue_create("flickr topPlace", NULL);
dispatch_async(downloadQueue, ^{
NSArray *topPlaces = [FlickrFetcher topPlaces];
dispatch_async(dispatch_get_main_queue(), ^{
self.topPlaces = @[@"test", @"test2", @"test3"];
});
});
次に の値を確認しますself.topPlaces
。それでもまだの場合NULL
、あなたのプロパティにはどのようなライフタイム修飾子がありますかself.topPlaces
(例: strong、weak、assign) を尋ねる必要がありますか? もしそうなら、もちろんそれへの強いポインタがないのでweak
、の値はそれを割り当てた後にtopPlaces
なります。NULL
である場合strong
、 の値NSArray *topPlaces = [FlickrFetcher topPlaces];
はNULL
、実行が に達したときself.topPlaces = topPlaces;
です。
考慮すべきもう 1 つの点は、非同期アクションを実行する場合、メイン スレッドでの実行が引き続き実行されることです。したがって、次のことを行っている場合...
dispatch_queue_t downloadQueue = dispatch_queue_create("flickr topPlace", NULL);
dispatch_async(downloadQueue, ^{
NSArray *topPlaces = [FlickrFetcher topPlaces];
dispatch_async(dispatch_get_main_queue(), ^{
self.topPlaces = topPlaces;
});
});
NSLog(@"topPlaces = %@", self.topPlaces);
次に、が終了して戻り、実行が に続くまで設定されないため、にヒットしたときself.topPlaces
は常にそうであると予想されます。その時点で、値を設定する必要があります。プロパティを設定するだけでなく、何らかの更新アクションを実行して、非同期アクションが完了した後に UI を更新するために、次のようなことを行うことができます...NULL
NSLog
[FlickrFetcher topPlaces]
dispatch_async(dispatch_get_main_queue()...
dispatch_queue_t downloadQueue = dispatch_queue_create("flickr topPlace", NULL);
dispatch_async(downloadQueue, ^{
NSArray *topPlaces = [FlickrFetcher topPlaces];
dispatch_async(dispatch_get_main_queue(), ^{
[self updateUIWithTopPlaces:topPlaces];
});
});
- (void)updateUIWithTopPlaces:(NSArray*)topPlaces {
self.topPlaces = topPlaces;
// Perform your UI updates here
}