我正在开发一个创建内容并将其发送到现有后端的应用程序。内容是标题、图片和位置。没有什么花哨。
后端有点复杂,所以这是我必须做的:
- 让用户拍照,输入标题并授权地图使用其位置
- 为帖子生成唯一标识符
- 在后端创建帖子
- 上传图片
- 刷新用户界面
我使用了几个 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 确实是要走的路,但我也觉得在某个地方有更好的实现。
谢谢!