1

私は、それぞれがNSURLConnectionを使用する他のクラスを使用して、いくつかの接続を(順次、並列ではなく)行う高レベルのクラスを持っています。

これらの補助クラスの1つは、NSArrayとしてデリゲートプロトコルを介して高レベルクラスに渡すアイテムの配列をダウンロードします。高レベルクラスには独自のNSArrayがあり、ダウンロードしたアイテムをその配列に追加します。

継承階層にいくつかのクラスがあり、各クラスはさまざまなコンテンツのダウンロードまたはアップロードを担当し、すべてがそれぞれのプロトコルを実装している高レベルのクラスによって制御されます。ただし、この継承階層に複数のクラスを含めることは、おそらくやり過ぎであり、物事を単純化することを検討していると思います。複数のオブジェクトを含める代わりに、オブジェクトを減らして、高レベルのクラスがそれらに提供することで動作の違いを得ることができるかどうか疑問に思いました。コンテンツのダウンロード時に実行されるブロック。

したがって、たとえば、高レベルのクラスは、ブロックとしてダウンロードされるNSArrayを解析および作成するためのコードを提供します。

スケッチ疑似形式:

@interface highLevelClass : NSObject
@property (strong, nonatomic) NSArray *theArray;
@property (strong, nonatomic) downloadingClass *theDownloader;
- (void) doDownload;
@end



@interface downloadingClass : NSObject
@property (strong, nonatomic) NSURLConnection *connection;
- (void) downloadArrayWithBlock:(void(^)()) theBlock;
@end



- (void) doDownload {
    [theDownloader: downloadArrayWithBlock:^ {
       [self.theArray appendObject: someObject]; 
     }
}

downloading class would execute the block in its implementation of NSURLConnectionDelegate:connectionFinishedLoading.

まず、highlevelClassのtheArrayを__blockを使用して宣言する必要があると思いますか?

しかし、私の主な質問は、何かをする必要がありますか?もしそうなら、可能性のある同時アクセスからアレイを保護するために、何をどのように行う必要がありますか?

highLevelClassは、タイマーイベントまたはユーザーアクションに応答して、theArrayからアイテムを削除する場合があります。私のコードはスレッドを使用していないため、その中のすべてが非アトミックである可能性があり、同時更新から保護する必要はありません。ただし、NSURLConnectionは内部で新しいスレッドを生成すると思います。したがって、theArrayがdownLoadingクラスに渡されるブロック内にある場合、危険の可能性はありますか?

4

1 に答える 1

0

自分でスレッドを生成しない場合は、ロックに関する予防措置を講じる必要はありません。NSURLConnectionが非同期ダウンロードを実行するために独自のスレッドを生成することは事実ですが、ダウンロードを開始したスレッドですべてのデリゲートメッセージを送信することにも注意を払っています。あなたの場合、メインスレッドですべてのダウンロードを開始しているので、すべてのデリゲートメッセージもメインスレッドで受信されることがわかります。

また、指定子については、ブロックがポインターをその配列に__block変更する場合にのみ必要であり、それが指す配列は変更されません。

于 2012-04-25T15:48:04.743 に答える