如何在等待服务器响应时显示活动指示条?

时间:2014-06-05 04:56:38

标签: ios ios7 activity-indicator

一切!首先,我已经看到了所有这类问题,但仍然感到困惑,这就是我要问的原因。 我有一个按钮“翻译”。当我按下按钮时,它会向服务器发送请求并获得响应。所以在等待回答时我需要显示活动指示条。我尝试了几个代码,但没有任何作用。任何人都可以帮助我吗?这是我的代码。我的活动指标是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;
}

感谢所有人!我发现了一种使用异步请求的方法。 现在一切正常。

3 个答案:

答案 0 :(得分:2)

您正在进行同步请求。所以它将在主线程上执行。这将使您的主线程忙,并且在此期间您的UI不会被更改。使通信请求异步,您的UI将使用活动视图进行更新。

答案 1 :(得分:0)

试试这个:

   //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];

答案 2 :(得分:0)

您只能在主线程上进行UI更改。

-(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);
});
}

也许这会对你有帮助。