У меня есть процесс с 3 шагами. Каждый из них должен быть выполнен до другого (синхронный, последовательный и т. Д.). Все они должны быть выполнены в фоновом режиме, чтобы не блокировать пользовательский интерфейс.Добавить блок в очередь с addOperationWithBlock и использовать блок завершения
Я пытаюсь немного перестроить вещи, чтобы использовать 2 очереди, один для сетевых операций, один для обновлений db для защиты основных данных. Подпрыгивая назад и вперед между очередями, я могу держать вещи серийными, просто отбирая блок, а затем, когда это называется, что-то получится.
Я использую addOperationWithBlock для создания операции и вставки в нее, но не вижу очевидного способа сделать блок завершения (например, я делаю это с помощью setCompletionBlock). Я не уверен, как начать второй шаг, когда это будет сделано. Я перепробовал его, и я просто вызываю следующий метод (отправную точку для шага 2) в конце блока для шага 1? Проблема в том, что внутри этих блоков могут быть асинхронные вызовы AFNetworking.
вот код и дополнительная информация. Я хочу попасть на сервер, захватить данные, то по завершении выполнения что-то другое, но связать их так, он должен перейти от данных к верификации шага серийно:
self.networkQueue = [NSOperationQueue new];
self.networkQueue.maxConcurrentOperationCount = 1;
self.databaseQueue = [NSOperationQueue new];
self.databaseQueue.maxConcurrentOperationCount = 1;
[self.networkQueue addOperationWithBlock:^{
NSString *listURL = [NSString stringWithFormat:GET_LIST,BASE_URL];
NSURL *url = [NSURL URLWithString:briefListURL];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest: request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
self.list = [NSArray arrayWithArray:(NSArray *)JSON];
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
[self listOperationDidFail];
}];
// define block that will execute when the task is finished
[operation setCompletionBlock:^{
// Latest data retrieved. Check if db needs updating
[self verifyList];
}];
[operation start];
}];
привет, спасибо за ответ, я действительно ценю это. Я обновил свой пост с помощью некоторого кода.пытаясь понять пример вложенности, который вы вставили, и я не совсем понимаю, извините. поэтому doTheFirstThingThenInvoke будет иметь фактический код первой вещи, и этот вызов знает, чтобы вызвать блок (вторая вещь), когда это было сделано? если первая вещь содержит асинхронный вызов, как она не возвращается и начинает вторую вещь после отключения асинхронного вызова? – skinsfan00atg