我有一个async子类,它完成后等待大约30秒,如果你可以看到,nslog显示OK的答案,但它等待太长时间,把显示在nslog中相同的文本,到UILabel…我怎么能打破这个?这是代码:
-(BOOL) setParams{
response.text = @"";
//NSLog(@"Start:rn");
[indicator setHidden:NO];
[indicator startAnimating];
if(pngData != nil){
request = [NSMutableURLRequest new];
request.timeoutInterval = 20.0;
[request setURL:[NSURL URLWithString:URL]];
[request setHTTPMethod:@"POST"];
NSString *boundary = @"---------------------------14737809831466499882746641449";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];
[request setValue:@"text/html,<span id="IL_AD4" class="IL_AD">application</span>/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" forHTTPHeaderField:@"Accept"];
[request setValue:@"Mozilla/5.0 (Macintosh; Intel <span id="IL_AD10" class="IL_AD">Mac OS X</span> 10_7_5) AppleWebKit/536.26.14 (KHTML, like Gecko) Version/6.0.1 Safari/536.26.14" forHTTPHeaderField:@"User-Agent"];
NSMutableData *body = [NSMutableData data];
[body appendData:[[NSString stringWithFormat:@"rn--%@rn",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
//Cada campo------------------------------------------------------------------------------------
NSString *keyName = @"add_product";
NSString *keyValue = @"valRichard";
[body appendData:[[NSString stringWithFormat:@"rn--%@rn",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name="%@"rnrn",keyName] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"%@",keyValue] dataUsingEncoding:NSUTF8StringEncoding]];
//--------------------------------------------------------------------------------------------
//----La Imagen
[body appendData:[[NSString stringWithFormat:@"rn--%@rn",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
NSString *imagePostName = @"imageToUpload";
NSString *imagePostValue = @"x-cosa.png";
[body appendData:[[NSString stringWithFormat:@"Content-Disposition:form-data; name="%@"; filename="%@"rn",imagePostName, imagePostValue] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Type: application/octet-streamrnrn" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[NSData dataWithData:pngData]];
[body appendData:[[NSString stringWithFormat:@"rn--%@--rn",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
//---------------------------------------------------------------------------------------------
[request setHTTPBody:body];
[request addValue:[NSString stringWithFormat:@"%lu", (unsigned long)[body length]] forHTTPHeaderField:@"Content-Length"];
return TRUE;
}else{
response.text = NO_IMAGE;
return FALSE;
}
}
- (IBAction) uploadImageAsync1:(id)sender
{
[indicator setHidden:NO];
if([self setParams]){
response.text = @"uploadImageAsync1";
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[NSURLConnection sendAsynchronousRequest:request queue:queue
completionHandler:^(NSURLResponse *urlResponse, NSData *data, NSError *error){
NSString *theAnswer =[NSString stringWithFormat:@"Finalizado: %@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]];
NSLog(@"%@",theAnswer);
//HERE IS THE CODE WHICH TAKES LIKE A MINUTE TO EXECUTE!!!!!
[indicator stopAnimating];
[indicator setHidden:YES];
response.text = theAnswer;
//END OF THE THREE LINES THAT EXECUTES AFTER
[UIApplication sharedApplication].networkActivityIndicatorVisible = FALSE;
if (error) {
NSLog(@"error:%@", error.localizedDescription);
}
}];
}
}
UILabel是UIKit的一部分,它不是线程安全的,应该只从主线程访问。sendAsynchronousRequest:
中的queue
参数是完成处理程序被调用的队列,所以你应该传递它[NSOperationQueue mainQueue]
,这样你的完成处理程序就会在主线程上被调用。