目标C语言 iOS异步任务结束并等待30秒完成自己



我有一个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],这样你的完成处理程序就会在主线程上被调用。

最新更新