0

最近、アプリにスレッドを追加して、ネットワーク リクエストが 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 のドット表記はシンタックス シュガーであり、必須ではないと思いました。同じ動作を実現する「無糖」の方法を知りたいです。

4

2 に答える 2

5

[self currentTopPlaces]実際にself.currentTopPlacesは同じですが、

[self.currentTopPlaces setArray:topPlaces]; // (1)
self.currentTopPlaces = topPlaces; // (2)

ではありません。self.currentTopPlaces(1) のすべての要素をの要素で置き換えますtopPlaces。(2) に新しい値を割り当てます(古い値がnilself.currentTopPlacesでない場合は解放します)。

self.currentTopPlacesis nilの場合は違いが あります: (1)メソッドがnilsetArray:に送信されるため、何もしません。(2) に新しい値を割り当てます。self.currentTopPlaces

ところで:__blockブロックは の値を変更しないため、修飾子はコードに必要ありませんtopPlaces

于 2012-08-07T21:10:17.723 に答える
2
[[self currentTopPlaces] setArray:topPlaces];
self.currentTopPlaces = topPlaces;

この二つは全く別の表現です。1 つ目は書かれているとおりで、2 つ目は次のようになります。

[self setCurrentTopPlaces:topPlaces];

ドット表記で最初のものを実行したい場合は、次のようになります。

self.currentTopPlaces.array = topPlaces;
于 2012-08-07T21:01:32.480 に答える