2009-08-31 9 views
13

私はNSOperationQueueを使用してHTTP接続(ASI-HTTPRequestを使用)を管理しています。私は複数のビューと、HTTP接続を要求するこれらの異なるビューを持つ必要があるので、アプリケーション代理人でグローバルなNSOperationQueueを作成しようとするか、それぞれのビューに1つずつは必要ですか?私はNSOperationQueueに慣れていません。View Controller間でNSOperationQueueを共有しますか?

私は、a)ベストプラクティスとは何か、b)ベストプラクティスがない場合は、トレードオフがあればどうなるかを知りたいと思います。

私はサーバー接続を処理するが、タスクは一度も実行されないクラスに操作キューを配置しようとしました(プロパティとして)。それを理解することはできませんでしたが、[キュー操作] = 0です。誰かがこれに対する解決策を知っていれば、これを置くのに最適な場所だと推測します。

答えて

14

NSOperationQueueのクラスメソッドを追加して解決しました。共有操作キュー私はこのようNSOperationQueue上のカテゴリとして追加:

// NSOperationQueue+SharedQueue.h 
@interface NSOperationQueue (SharedQueue) 
+(NSOperationQueue*)sharedOperationQueue; 
@end 

// NSOperationQueue+SharedQueue.m 
@implementation NSOperationQueue (SharedQueue) 
+(NSOperationQueue*)sharedOperationQueue; 
{ 
    static NSOperationQueue* sharedQueue = nil; 
    if (sharedQueue == nil) { 
    sharedQueue = [[NSOperationQueue alloc] init]; 
    } 
    return sharedQueue; 
} 
@end 

私は、私は本当にする必要がない限り、キューの全体の束を管理する必要はありませんこの方法です。すべてのビューコントローラからの共有キューに簡単にアクセスできます。

私もそれがさらに簡単に、この共有キューに新しい操作を追加できるようにすることNSObjectのにカテゴリを追加しました:このため

// NSObject+SharedQueue.h 
@interface NSObject (SharedQueue) 
-(void)performSelectorOnBackgroundQueue:(SEL)aSelector withObject:(id)anObject; 
@end 

// NSObject+SharedQueue.m 
@implementation NSObject (SharedQueue) 
-(void)performSelectorOnBackgroundQueue:(SEL)aSelector withObject:(id)anObject; 
{ 
    NSOperation* operation = [[NSInvocationOperation alloc] initWithTarget:self 
                   selector:aSelector 
                    object:anObject]; 
    [[NSOperationQueue sharedOperationQueue] addOperation:operation]; 
    [operation release]; 
} 
@end 
+1

このキューは再びどのように割り当て解除されますか? – fabb

0

各ビュー/ビューコントローラで接続を処理するクラスへのポインタがすでにある場合は、操作キューへのポインタも必要な理由はありません。

あなたがしたいことは、次のようなものだと思います:a)サーバハンドリングオブジェクトにビュー(コントローラ)ハンドURL(+データ)を渡す、b)サーバハンドリングオブジェクトが操作を作成し、へのポインタを持っています。

詳細を入力しないと、それがうまくいかなかった理由を理解するのは難しいです。

この種のタスクを処理するNetworkQueueクラスを提供するtaking a look at ASIHTTPRequestを強くお勧めします。進捗状況を記録するために登録する便利なデリゲートフィールドがいくつか用意されています。ダウンロードやアップロードの完了を知ることができます。

3

私の個人的な好みは、すべてのHTTP要求を管理するシングルトンを持つことです。次に、各ビューはシングルトンにhttp呼び出しを要求し、その呼び出しの代理人として自身を渡してから、NSOperationに委譲して呼び出すシングルトンの手を呼び出し、NSOperationはコールが完了したらコールバックします。

+0

私はシングルトンを使いません、私はアプリケーションデリゲートをハングするdataControllerを使います.2)私はデリゲートの代わりに通知を使います。複数のビューコントローラと要求/操作を使用すると、委譲ロジックがかなり厄介になることがあります。 – kubi

関連する問題