最近、アプリにスレッドを追加して、ネットワーク リクエストが UI をブロックしないようにしました。これを行うと、スレッド化を実装する前と同じ方法でインスタンス変数を設定できなくなっていることがわかりました。私のインスタンス変数は、次のように宣言されたプロパティです。
@property (nonatomic, strong) NSMutableArray *currentTopPlaces;
インスタンス変数 self.currentTopPlaces を誤って設定した方法を次に示します。
dispatch_queue_t downloadQueue = dispatch_queue_create("Flickr Top Places Downloader", NULL);
dispatch_async(downloadQueue, ^{
__block NSArray *topPlaces = [FlickrFetcher topPlaces];
dispatch_async(dispatch_get_main_queue(), ^{
self.tableRowCount = [topPlaces count];
[[self currentTopPlaces] setArray:topPlaces];
});
[self currentTopPlace] setArray:topPlaces] を使用すると、GCD の使用を開始する前に、ブロッキング バージョンで問題なく動作しました。
さて、正しく動作させるためには、次のように設定する必要があります。
dispatch_queue_t downloadQueue = dispatch_queue_create("Flickr Top Places Downloader", NULL);
dispatch_async(downloadQueue, ^{
__block NSArray *topPlaces = [FlickrFetcher topPlaces];
dispatch_async(dispatch_get_main_queue(), ^{
self.tableRowCount = [topPlaces count];
self.currentTopPlaces = topPlaces;
});
誰かが使用の違いを私に説明できますか:
[[self currentTopPlaces] setArray:topPlaces];
と:
self.currentTopPlaces = topPlaces;
具体的には、「setArray」呼び出しがスレッド化されたブロックで機能しなかったのはなぜですか?
Objective-C のドット表記はシンタックス シュガーであり、必須ではないと思いました。同じ動作を実現する「無糖」の方法を知りたいです。