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-флаг, можете написать обёртку над вашем методом выше которая сама будет рулить такие ситуации
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы