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