Obj-C Как правильно работать с потоками?

В общем такая ситуация, пользуюсь библиотекой AFNetworking выполняю POST запрос - авторизация, запрос проходит всё отлично, но когда запрос в процессе и пользователь нажимает ещё раз на кнопку "Вход" происходят странные вещи, так как прошлый запрос не успел отработать, и тут идёт ещё один, я конечно понимаю что можно создать BOOL переменную, и когда запрос в процессе не вызывать метод авторизации, но это очень долго, особенно когда методов много, каким другим образом можно избежать данной ошибки? Наверника же есть отработанные схемы, возможно я очень плохо искал - но я не нашел решения ситуации в Google.

Пример запроса:
- (IBAction)login:(UIButton *)sender {
	AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
	NSDictionary *parameters = @{@"_login": @"bar", @"_pass" : @"123"};
	[manager POST:@"http://example.com/resources.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
	    NSLog(@"JSON: %@", responseObject);
	} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
	    NSLog(@"Error: %@", error);
	}];
}


Спасибо за внимание! Надеюсь найти тут решение проблемы.
  • Вопрос задан
  • 2736 просмотров
Решения вопроса 1
morozovdenis
@morozovdenis
в этом конкретном случае вам надо просто дизаблить кнопку

- (IBAction)login:(UIButton *)sender {
        sender.enabled = NO;
	AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
	NSDictionary *parameters = @{@"_login": @"bar", @"_pass" : @"123"};
	[manager POST:@"http://example.com/resources.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
	    NSLog(@"JSON: %@", responseObject);
            sender.enabled = YES;
	} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
	    NSLog(@"Error: %@", error);
            sender.enabled = YES;
	}];
}


в общем случае задача которую вы описываете на мой взгляд специфична для каждого проекта.

если хотите запросы одного типа выполять последовательно, можете использовать например NSOperationQueue

если хотите что-бы в один момент выполнялся только один запрос конкретного типа, то в любом случае заводить BOOL-флаг, можете написать обёртку над вашем методом выше которая сама будет рулить такие ситуации
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы