我的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的文字从未设定?代码块有限制吗?如果是这样,我将如何解决我的问题?干杯!
答案 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
可见(它被添加到视图层次结构中,其框架是合适的)。