2014-06-05 27 views
1

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

谢谢大家!我发现一种方式很适合使用异步请求。 现在一切工作精美。

回答

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

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

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

也许这会帮助你。

相关问题