コンテンツを作成して既存のバックエンドに送信するアプリケーションに取り組んでいます。内容は、タイトル、写真、場所です。派手なものはありません。
バックエンドは少し複雑なので、私がしなければならないことは次のとおりです。
- ユーザーが写真を撮り、タイトルを入力し、マップがその場所を使用することを許可します
- 投稿の一意の識別子を生成します
- バックエンドで投稿を作成する
- 写真をアップロードする
- UI を更新する
これを機能させるためにいくつかの NSOperation サブクラスを使用しましたが、自分のコードを誇りに思っているわけではありません。ここにサンプルがあります。
NSOperation *process = [NSBlockOperation blockOperationWithBlock:^{
// Process image before upload
}];
NSOperation *filename = [[NSInvocationOperation alloc] initWithTarget: self selector: @selector(generateFilename) object: nil];
NSOperation *generateEntry = [[NSInvocationOperation alloc] initWithTarget: self selector: @selector(createEntry) object: nil];
NSOperation *uploadImage = [[NSInvocationOperation alloc] initWithTarget: self selector: @selector(uploadImageToCreatedEntry) object: nil];
NSOperation *refresh = [NSBlockOperation blockOperationWithBlock:^{
// Update UI
[SVProgressHUD showSuccessWithStatus: NSLocalizedString(@"Success!", @"Success HUD message")];
}];
[refresh addDependency: uploadImage];
[uploadImage addDependency: generateEntry];
[generateEntry addDependency: filename];
[generateEntry addDependency: process];
[[NSOperationQueue mainQueue] addOperation: refresh];
[_queue addOperations: @[uploadImage, generateEntry, filename, process] waitUntilFinished: NO];
ここに私が好きではないものがあります:
- 私のcreateEntry:たとえば、生成されたファイル名をプロパティに保存しています。これは、クラスのグローバルスコープと一致しています
- uploadImageToCreatedEntry: メソッドでは、dispatch_async + dispatch_get_main_queue() を使用して、HUD のメッセージを更新しています。
- 等
このようなワークフローをどのように管理しますか? 複数の完了ブロックを埋め込むことは避けたいと思います.NSOperationが本当に進むべき道だと感じていますが、どこかにもっと良い実装があると感じています.
ありがとう!