Как показать полосу индикатора активности в ожидании ответа от сервера?

все! Во-первых, я видел все подобные вопросы, но все еще запутался, поэтому и спрашиваю. У меня есть кнопка "перевести". Когда я нажимаю кнопку, он отправляет запрос на сервер и получает ответ. Поэтому, пока я жду ответа, мне нужна полоса индикатора активности. Я пробовал несколько кодов, но ничего не работает. Может ли кто-нибудь помочь мне с этим? Вот мой код. Мой индикатор активности — activityInd.

-(IBAction)translate
{
NSDictionary *dict=[NSDictionary dictionaryWithObjectsAndKeys:[[self textView1] text], @"SourceText",@"8a^{F4v", @"CheckCode",@"0",@"TranslateDirection",@"1",@"SubjectBase", nil];
NSError *error=nil;
    NSData *result=[NSJSONSerialization dataWithJSONObject:dict options:0 error:&error];
    NSURL *url=[NSURL URLWithString:@"http://fake.com/notRealUrl"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60];


    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:result];

    NSURLResponse *response=nil;

    NSData *POSTReply = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];

    NSString *theReply = [[NSString alloc] initWithBytes:[POSTReply bytes] length:[POSTReply length] encoding: NSUTF8StringEncoding ];

    NSString *str=theReply;
    str= [str substringWithRange:NSMakeRange(51, str.length - 51 - 2)];

    NSString *result2=[str stringByReplacingOccurrencesOfString:@"\\r\\n" withString:@""];
    _textView.text=result2;
}

СПАСИБО ВСЕМ! Я НАШЕЛ СПОСОБ ИСПОЛЬЗОВАНИЯ АСИНХРОННОГО ЗАПРОСА. ТЕПЕРЬ ВСЕ РАБОТАЕТ ОТЛИЧНО.


person user3701608    schedule 05.06.2014    source источник


Ответы (3)


Вы делаете синхронный запрос. Таким образом, он будет выполняться в основном потоке. Это сделает ваш основной поток занятым, и ваш пользовательский интерфейс не будет изменен в течение этого времени. Сделайте запрос на связь асинхронным, и ваш пользовательский интерфейс будет обновлен с представлением активности.

person Apurv    schedule 05.06.2014

Попробуй это:

   //set ivar in your view controller
   UIActivityIndicatorView * spinner;

   //alloc init it  in the viewdidload
    spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    [self addSubview:spinner];
    [spinner setFrame:CGRectMake(0, 0, 100, 100)];
    [spinner setCenter:CGPointMake(self.center.x, 150)];
    spinner.transform = CGAffineTransformMakeScale(2, 2);
    [spinner setColor:[UIColor darkGrayColor]];

Перед запросом добавьте следующий код:

[self bringSubviewToFront:spinner];
[spinner startAnimating];

По окончании:

[spinner stopAnimating];
person Bikram Thapa    schedule 05.06.2014

Вы можете вносить изменения в пользовательский интерфейс только в основном потоке.

-(void)translate
{
//maybe your app is running on main thread so Start Spinner in main thread.
UIActivityIndicatorView * spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];

[spinner setCenter:self.view.center];
[self.view addSubview:spinner];
[self.view bringSubviewToFront:spinner];
[spinner startAnimating];

// Create this temporary block.
[self callService:^(NSData *data, BOOL success)
{
    /*--- When you get response execute code in main thread and stop spinner. ---*/
    dispatch_async(dispatch_get_main_queue(), 
    ^{
        // now app is in main thread so stop animate.
        [spinner stopAnimating];
        if (success)
        {
            NSString *theReply = [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding: NSUTF8StringEncoding ];
            //do what you want.

        }
    });
}];
}

-(void)callService:(void(^)(NSData *data,BOOL success))block
{
//we are calling Synchronous service in background thread.
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{

    NSDictionary *dict=[NSDictionary dictionaryWithObjectsAndKeys:@"", @"SourceText",@"8a^{F4v", @"CheckCode",@"0",@"TranslateDirection",@"1",@"SubjectBase", nil];
    NSError *error=nil;
    NSData *result=[NSJSONSerialization dataWithJSONObject:dict options:0 error:&error];
    NSURL *url=[NSURL URLWithString:@"http://fake.com/notRealUrl"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60];

    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:result];

    NSURLResponse *response=nil;

    NSData *POSTReply = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];

    // When we got response we check that we got data or not . if we get data then calling this block again.
    if (POSTReply)
        block(POSTReply,YES);
    else
        block(nil,NO);
});
}

Может быть, это поможет вам.

person ChintaN -Maddy- Ramani    schedule 05.06.2014