在代码块中设置UILabel文本

时间:2014-02-14 02:08:56

标签: ios objective-c nsurlrequest

我的NSURLConnection sendAsynchronousRequest有一个代码块,当我尝试设置UILabel的文本时,即使值存在,也永远不会设置文本。这是我的代码:

    NSString *address = [addresses objectAtIndex:indexPath.row];
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://myurl.com/%@", address]]];
    [NSURLConnection sendAsynchronousRequest:urlRequest queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
        if ([data length] > 0 && error == nil)
        {
            NSString *dataOfData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            if(![dataOfData isEqualToString:@"ERROR: address invalid"]) {
                [balanceLabel setText:[NSString stringWithFormat:@"Balance: %@", dataOfData]];
                if(data) {
                    qrCodeButton.alpha = 1;
                }
            } else {
                errorLabel.text = @"This address is invalid.";
            }
        }
        else if ([data length] == 0 && error == nil)
        {
            NSLog(@"Nothing was downloaded.");
            [balanceLabel setText:@"Server Error, Please Try Again"];
        }
        else if (error != nil){
            NSLog(@"Error = %@", error);
        }
    }];

为什么UILabel的文字从未设定?代码块有限制吗?如果是这样,我将如何解决我的问题?干杯!

2 个答案:

答案 0 :(得分:4)

这是因为NSOperationQueue不是主线程。你在做什么是非法的。可悲的是,没有必要!只是说:

[NSURLConnection sendAsynchronousRequest:urlRequest 
     queue:[NSOperationQueue mainQueue]
     completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
        // ... and the rest exactly as you have it now

全部修复。您的请求在后台线程上是异步的,但是当它在完成处理程序上返回给您时,您将在主线程上并且能够与接口等通信。

答案 1 :(得分:2)

您的代码操作UI元素应该在主线程上执行。

dispatch_async(dispatch_get_main_queue(), ^{
    if ([data length] > 0 && error == nil)
    {
        NSString *dataOfData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        if(![dataOfData isEqualToString:@"ERROR: address invalid"]) {
            [balanceLabel setText:[NSString stringWithFormat:@"Balance: %@", dataOfData]];
            if(data) {
                qrCodeButton.alpha = 1;
            }
        } else {
            errorLabel.text = @"This address is invalid.";
        }
    }
    else if ([data length] == 0 && error == nil)
    {
        NSLog(@"Nothing was downloaded.");
        [balanceLabel setText:@"Server Error, Please Try Again"];
    }
    else if (error != nil){
        NSLog(@"Error = %@", error);
    }
}) ;

确保errorLabel不是nil且UILabel可见(它被添加到视图层次结构中,其框架是合适的)。