0

次のコードを使用してtopPlaces、View Controller 内で呼び出されるプロパティを変更しています。この行は を[FlickrFetcher topPlaces]返し、NSArray私のプロパティtopPlacesももちろん NSArray です。

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;
    });
});
dispatch_release(downloadQueue);

ただし、ブロックの実行が終了した後、 の値をログに記録すると、self.topPlaces何らかの理由で NULL のままです。不足しているものはありますか?

4

2 に答える 2

2

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 を更新するために、次のようなことを行うことができます...NULLNSLog[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
}
于 2013-05-21T01:45:33.117 に答える