2 か月前、私は新しい iPhone アプリケーションの作成を開始しました。このため、ユーザー認証、ユーザー プロファイル、フレンドシップ システム、メディア処理、メッセージングなどの必要な機能を多数持つことができる、一般的な RESTFul Web サービスを作成しました。システムなど。私の考えでは、将来の iPhone アプリケーションでこの Web サービスを再利用するユースケースがいくつかあります。
このような心構えで、メディア (画像、ビデオ、サウンド) のセットアップと処理、Web サービスとの通信、解析とマッピングなどのすべての重労働を処理する、このアプリケーション (および将来のすべてのアプリケーション) 用の静的ライブラリを作成することにしました。結果の処理、CoreData の処理など。
私のアプリケーションでは、多くの並列タスクが実行されているシナリオがあります (最悪の場合)。たとえば、ユーザーが現在自分のプロフィール写真を変更しているときに、アプリケーションがユーザーの場所を (バックグラウンドで) サーバーに送信し、新しいプッシュ通知が送信されます。受け取った。
そこで、各論理操作 (SendUserLocation や GetCurrentFriendList など) を NSOperation にカプセル化し、それらを serviceQueue (NSOperationQueue) に追加することにしました。
各操作は、操作が Web サービスから結果を正常に取得し、すぐに処理する必要がある場合にサブタスクを生成できます。
典型的な ServiceManager メソッドは次のようになります
- (void)activateFriendsSync:(id)observer onSuccess:(SEL)selector {
ELOSyncFriends *opSyncFriends = [[ELOSyncFriends alloc] initWithSM:self];
[self ELServiceLogger:opSyncFriends];
[serviceQueue addOperation:opSyncFriends];
if(observer) {
[self registerObserver:observer selector:selector name:opSyncFriends.notificationName];
}
}
各操作、(サーバーへの) 要求、および subTask は、GUID を notificationName として使用して、処理が完了したときに親オブジェクトに通知します。操作のすべてが完了すると、ユーザー インターフェイスに通知が返されます。
とはいえ、サブタスクを追加および削除するためのコードは次のようになります
- (void)removeSubTask:(NSNotification*)notification {
ELRequest *request = (ELRequest*)[notification object];
[subTasks removeObjectIdenticalTo:request.notificationName];
if([subTasks count] == 0) {
// all SubTaks done, send notification to parent
[serviceManager.notificationCenter postNotificationName:self.notificationName object:request];
}
}
- (NSString*)addSubTask {
NSString* newName = [self GetUUID];
[subTasks addObject:[newName retain]];
[serviceManager.notificationCenter addObserver:self selector:@selector(removeSubTask:) name:newName object:nil];
return newName;
}
- (NSString *)GetUUID {
CFUUIDRef theUUID = CFUUIDCreate(NULL);
CFStringRef string = CFUUIDCreateString(NULL, theUUID);
CFRelease(theUUID);
return [(NSString *)string autorelease];
}
あとは、GUI で serviceManager を呼び出して、次のような特定の操作を開始するだけです。
[self.core.serviceManager activateFriendsSync:nil onSuccess:nil];
オブザーバーを登録したい場合は、次のようにオブザーバー オブジェクトとセレクターを渡すだけです。
[self.core.serviceManager activateFriendsSync:self onSuccess:@selector(myMethod:)];
最後になりましたが、私の質問: 「アーキテクチャ」は非常にうまく動作し、安定していますが、実行する価値はありますか? オーバーヘッドが多すぎますか? それは理にかなっていますか?個人的には、並行操作をどのように実装していますか?
ベスト・ヘンリック
PS私の質問を自由に編集し、質問をして(コメントとして)、この考えの名前を呼んでください。
基本的に私は英語のネイティブスピーカーではないので、説明するのに本当に苦労しました. 誤解しないでください。私は、この投稿を何らかの形で自慢するために書いたわけではありません。私がしたいのは学ぶことだけです(そして、より高度なiPhone / Objective Cの質問を書くことかもしれません)