如何在标签中显示GET请求

25 浏览
0 Comments

如何在标签中显示GET请求

我的GET请求只在命令行NSLog中有效。

我需要在标签中显示数据,但是它无法工作。

- (void)getRequest {
    NSURLSessionConfiguration *getConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *getSession = [NSURLSession sessionWithConfiguration:getConfigObject delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    NSURL *getUrl = [NSURL URLWithString:@"http://localhost:3000/get"];
    NSURLSessionDataTask *getDataTask = [getSession dataTaskWithURL:getUrl completionHandler:^(NSData *getData, NSURLResponse *getResponse, NSError *getError) {
        if (getError == nil) {
            NSString *getString = [[NSString alloc] initWithData:getData encoding:NSUTF8StringEncoding];
            [self.label setText:getString]; // 无法工作!
            NSLog(@"Data = %@", getString); } // 它工作了!
        MainViewController *l = [[MainViewController alloc] init];
        [l getRequest];
    }];
    [getDataTask resume];
}

0
0 Comments

问题的原因是方法不能在主线程上工作,而更新UI需要在主线程上操作。解决方法是使用GCD的dispatch_async函数或NSOperationQueue的addOperationWithBlock方法来将UI更新的代码放在主线程上执行。

具体代码如下:

if (getError == nil) {
    NSString * getString = [[NSString alloc] initWithData: getData encoding: NSUTF8StringEncoding];
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.label setText: getString];
        NSLog(@"Data = %@", getString);
    });
}

或者可以使用NSOperationQueue的addOperationWithBlock方法:

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
    [self.label setText:getString];       
}];

参考链接:为什么在高级应用程序中应选择GCD而不是NSOperation和blocks?

0
0 Comments

问题出现的原因是想要在Label中显示GET请求的结果,但是没有正确实现。解决方法是使用dispatch_async函数将设置Label文本的操作放在主队列中执行。

代码如下:

dispatch_async(dispatch_get_main_queue(), ^{
    [self.label setText:someString];
});

这段代码使用了GCD的dispatch_async函数,将设置Label文本的操作放在主队列中执行。主队列是一个串行队列,它会按照先进先出的顺序执行任务,而且所有UI更新操作都必须在主队列中执行。

首先,dispatch_async函数接受两个参数,第一个参数是dispatch_queue_t类型的队列,用于指定需要执行任务的队列。这里使用的是dispatch_get_main_queue()函数获取主队列。第二个参数是一个block,用于指定需要执行的任务。

在这个block中,使用了[self.label setText:someString]来设置Label的文本内容。需要注意的是,所有UI更新操作都必须在主队列中执行,否则可能会导致界面更新不及时或者出现其他问题。

通过将设置Label文本的操作放在主队列中执行,就可以保证界面更新的正确性和及时性。这样,就可以正确显示GET请求的结果在Label中了。

0
0 Comments

问题出现的原因是使用了错误的语法,应该使用正确的语法[self.label setText:[NSString stringWithFormat:"Data = %@", getString];来显示GET请求的结果。

解决方法是将上述正确的语法应用到代码中,这样就可以在Label中显示GET请求的结果。

0