したがって、RESTkitを利用してRESTWebサービスを利用するこのサービスクラスがあります。それは私のアプリで頻繁に使用されます。使用する前に毎回初期化する代わりに、このクラスのオブジェクトを作成し、appDelegateで初期化します。しかし、これはそうするための最良の方法ですか?
シングルトンを使うことを考えましたが、マルチスレッド環境では少し心配でした。どんな提案でも本当にありがたいです。ありがとう!
編集:私はARC環境で働いていることを言及する必要があります。
したがって、RESTkitを利用してRESTWebサービスを利用するこのサービスクラスがあります。それは私のアプリで頻繁に使用されます。使用する前に毎回初期化する代わりに、このクラスのオブジェクトを作成し、appDelegateで初期化します。しかし、これはそうするための最良の方法ですか?
シングルトンを使うことを考えましたが、マルチスレッド環境では少し心配でした。どんな提案でも本当にありがたいです。ありがとう!
編集:私はARC環境で働いていることを言及する必要があります。
オブジェクト データが読み取り専用または保護されている限り、マルチスレッドまたは ARC 環境であっても、シングルトン パターンに問題はありません。このようなクラスを作成するときは、シングルトンを使用し、GCD を使用して、それが使用するごく少数の変更可能なデータ構造へのアクセスを保護します (それによって満たされている現在のリクエストのリストや、完了時に実行する完了ブロックなど)。
iOS 5 以降または Mac OS X 10.7 以降をサポートしている場合、新しいプライベート同時キューとバリアにより、これがさらに効率的になります。RestKits のマルチスレッドについては知らないので、確認する必要があるかもしれませんが、それでもシングルトンをお勧めします。
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 によって処理されることが望ましいためです。