Проблема с потоковой передачей UIKeyboardTaskQueue

#ios #objective-c #multithreading #objective-c-blocks

#iOS #objective-c #многопоточность #objective-c-блоки

Вопрос:

Я довольно новичок в разработке iOS, и я застрял на этой ошибке на некоторое время. Я создаю простое приложение, использующее веб-сервис. Сейчас у меня есть два контроллера просмотра. Контроллер представления входа (с его файлом NIB) и контроллер основного представления (с его файлом NIB). Когда я создавал приложение, я выбрал пустое приложение, поэтому у меня нет раскадровки. Вместо этого я использую UINavigationController . Когда я запускаю свой код, я получаю следующую ошибку после ввода имени пользователя и пароля и нажатия кнопки отправки в представлении входа:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIKeyboardTaskQueue waitUntilAllTasksAreFinished] may only be called from the main thread.'

Это код, который у меня есть для моей кнопки отправки:

 -(IBAction)logIn:(id)sender{
    UIApplication *application = [UIApplication sharedApplication];
    application.networkActivityIndicatorVisible = YES;

    [_loginNetworkingContorller checkCredentialsWithUsername:self.username.text withPassword:self.password.text completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        if(!error){
            NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;
            if (httpResp.statusCode == 200) {
                NSLog(@"SUCESS");
                NSDictionary *credentials = @{self.username.text: self.password.text};
                [KeychainUserPass save:@"MY APP" data:credentials];
                UIViewController *mainView = [[RDMainViewController alloc] initWithNibName:@"RDMainViewController" bundle:nil];

                [self.navigationController pushViewController:mainView animated:YES];
            }
            else{
                NSLog(@"ERROR");
            }
        }
        else{
            NSLog(@"ERROR");
        }
    }];
}
 

И вот код для следующей функции

 [_loginNetworkingContorller checkCredentialsWithUsername:self.username.text withPassword:self.password.text completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)

-(void)checkCredentialsWithUsername:(NSString *)username withPassword:(NSString *)password completionHandler:(void (^)(NSData *data,NSURLResponse *response, NSError *error))myCompletion
{
    NSString *requestString = @"SOME WEBSITE";
    NSURL *url = [NSURL URLWithString:requestString];
    NSURLRequest *req = [NSURLRequest requestWithURL:url];

    NSData *userPasswordData = [[NSString stringWithFormat:@"%@:%@", username, password] dataUsingEncoding:NSUTF8StringEncoding];
    NSString *base64EncodedCredential = [userPasswordData base64EncodedStringWithOptions:0];
    NSString *authString = [NSString stringWithFormat:@"Basic %@", base64EncodedCredential];

    NSURLSessionConfiguration *sessionConfig=[NSURLSessionConfiguration defaultSessionConfiguration];
    sessionConfig.HTTPAdditionalHeaders=@{@"Authorization":authString};

    self.session=[NSURLSession sessionWithConfiguration:sessionConfig];

    NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:req completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        myCompletion(data, response, error);
    }];

    [dataTask resume];
}
 

Сейчас я застрял и не совсем уверен, в чем проблема, тем более что я ничего не делаю с клавиатурой. У меня такое чувство, что есть проблема с моими блоками, но я не совсем уверен, в чем проблема. Буду признателен за любую помощь.

Ответ №1:

Привет, у меня была такая же проблема после того, как я получил ответ от своего веб-вызова. Я смог решить ее, выполнив следующее:

  //do something with response

  dispatch_async(dispatch_get_main_queue()) { () -> Void in

     // continue with program by calling next step on main thread           
  }
 

Я думаю, что если вы перейдете к следующему контроллеру представления, iOS попытается сделать это не в основном потоке, что приведет к ошибке, но я не уверен на 100%, что это точно