2016-03-02 8 views
0

У меня есть простое приложение, которое пытается войти в систему.Как заморозить мое приложение, чтобы ждать ответа?

вставка пользователя имя пользователя и пароль я вызвать метод в другом классе ->

if ([myBankLogger checkUserLogin:self.memberNumber.text :self.accessCode.text]) 
{ 
     //Check if user credential is correct 
     NSLog(@"Corrct"); 
} 
else 
{ 
     NSLog(@"Not correct"); 
} 

В checkUserLogin я отправить запрос HTTP на сервер, и это занимает минуту, чтобы получить отвечают:

-(bool) checkUserLogin :(NSString*)username :(NSString*)password 
{ 

    __block bool tmp= false; 
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 
    [manager POST:string parameters:parameters progress:nil success:^(NSURLSessionTask *task, id responseObject) { 

     NSLog(@"JSON: %@", responseObject); 
     if (responseObject[@"secret_token"]) 
     { 
      NSLog(@"HERE"); 
      tmp = true; 
     } 

    } failure:^(NSURLSessionTask *operation, NSError *error) { 
     NSLog(@"Error: %@", error); 
     tmp = false; 
    }]; 

    return tmp; 
} 

Как обычно, доза компилятора не дожидаться завершения обработки. Он возвращает false. Я исследовал и узнал, что я должен использовать это:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul); 
dispatch_async(queue, ^{ 
    // Perform async operation 
    // Call your method/function here 
    // Example: 
    // NSString *result = [anObject calculateSomething]; 
    dispatch_sync(dispatch_get_main_queue(), ^{ 
     // Update UI 
     // Example: 
     // self.myLabel.text = result; 
    }); 
}); 

Но я не уверен, где я должен поставить свой код? Оцените любое предложение или более простое решение.

ответ

0

Если вы выполняете синхронную операцию в основном потоке, это заблокирует пользовательский интерфейс приложения в течение всего времени выполнения этой операции синхронизации. Если этого требует слишком много, ОС убьет выполнение приложения. При асинхронном подходе с использованием методы доставки, вы можете решить проблему блокировки интерфейса:

[self.myRingLoading startAnimating]; // show a ring loading while the following long operation will take (here you are in the main thread scope) 

// this dispatch block will move all the actions in an async thread, avoiding any UI blocking issue 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ 

    // Perform here your UI blocking operation 
    // sample blocking ui operation 
    NSData* httpDataResult = [NSData dataWithContentsOfURL:@"http://api.yoursite.com/xyz"]; 
    NSString* httpStringResult = [[NSString alloc] initWithData:httpDataResult encoding:NSUTF8StringEncoding]; 

    // this dispatch block will send all action execution to the main queue, commonly the main thread 
    dispatch_async(dispatch_get_main_queue(), ^(void){ 
     // Perform your UI operation (eg: printing the http response received by the server 
     [self.myUILabel setText:httpStringResult]; 
     [self.myRingLoading stopAnimating]; // hide the ring loading since the long operation is finished 
    }); 
}); 

Есть другие нативные решения для получения результата, например, с использованием NSOperation и NSOperationQueue. Если вы используете AFNetworking, вы можете воспользоваться несколько хороших реализациями, например AFHTTPRequestOperation:

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:request]; 
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 

    // Perform your UI actions for the Success case 

} 
    failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

    // Perform your UI actions for the Failed case 

} 
]; 
// run the http operation process 
[operation start]; 

Надеется, что это помогает

Смежные вопросы