2

したがって、RESTkitを利用してRESTWebサービスを利用するこのサービスクラスがあります。それは私のアプリで頻繁に使用されます。使用する前に毎回初期化する代わりに、このクラスのオブジェクトを作成し、appDelegateで初期化します。しかし、これはそうするための最良の方法ですか?

シングルトンを使うことを考えましたが、マルチスレッド環境では少し心配でした。どんな提案でも本当にありがたいです。ありがとう!

編集:私はARC環境で働いていることを言及する必要があります。

4

2 に答える 2

2

オブジェクト データが読み取り専用または保護されている限り、マルチスレッドまたは ARC 環境であっても、シングルトン パターンに問題はありません。このようなクラスを作成するときは、シングルトンを使用し、GCD を使用して、それが使用するごく少数の変更可能なデータ構造へのアクセスを保護します (それによって満たされている現在のリクエストのリストや、完了時に実行する完了ブロックなど)。

iOS 5 以降または Mac OS X 10.7 以降をサポートしている場合、新しいプライベート同時キューとバリアにより、これがさらに効率的になります。RestKits のマルチスレッドについては知らないので、確認する必要があるかもしれませんが、それでもシングルトンをお勧めします。

于 2012-07-06T17:37:00.770 に答える
1

ARCはあまり関係ありません。シングルトンの負の側面を理解し、それを受け入れる準備ができているか、それに対処する準備ができている限り、パターンはうまく機能します。

別の方法として提案するのは、静的クラスを設計し、プロバイダー パターンを使用することです。これは私が RESTKit で使用する典型的なインターフェースです (これは facebook グラフ API にアクセスします)。

@interface FBProvider : NSObject

+ (BOOL) canMakeRequests;
+ (id) login;
+ (id) logout;

+ (BOOL) application: (UIApplication*) application 
             openURL: (NSURL*) url 
   sourceApplication: (NSString*) sourceApplication 
          annotation: (id) annotation;

+ (id) perform: (RKRequestMethod) method friends: (Friend*) frien;
+ (id) perform: (RKRequestMethod) method boasts: (id) obj;
+ (id) perform: (RKRequestMethod) method invites: (id)obj;
+ (id) perform: (RKRequestMethod) method likes: (id)obj;

@end

シングルトンはなく、すべてが静的であり、アプリ データ モデルから動作するようにインターフェイスを設計すると、Web サービス UI の更新は自動的に行われません。

または、シングルトンを使用する必要があると思われる場合は、真のシングルトンであるアプリ デリゲートを使用しないでください。拡張するには、Web サービスまたはデータ プロバイダーが既存のシングルトンのメンバーになることをお勧めします。これにより、スレッドの問題について自分で心配する必要がなくなります。これは Cocoa によって処理されることが望ましいためです。

于 2012-07-09T07:53:41.323 に答える