Я работаю над приложением, которое создает содержимое и отправляет его на существующий бэкэнд. Контент - это заголовок, изображение и местоположение. Ничего необычного.
Бэкэнд немного сложный, поэтому вот что мне нужно сделать:
- Позвольте пользователю сделать снимок, ввести заголовок и разрешить карте использовать его расположение
- Создайте уникальный идентификатор сообщения
- Создать сообщение на бэкэнд
- Загрузить изображение
- Обновить пользовательский интерфейс
Я использовал несколько подклассов 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 действительно является способом выхода, но я также чувствую, что где-то лучше реализована реализация.
Спасибо!