首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >iOS Objective-C NSURLSession不更新UI /属性

iOS Objective-C NSURLSession不更新UI /属性
EN

Stack Overflow用户
提问于 2018-06-02 20:03:25
回答 1查看 128关注 0票数 0

我在Objective-C iOS应用程序中更新UI时遇到一些问题。

我在我的ViewController的viewDidLoad部分调用我的函数fetchData。

NSURLSession成功地获取了数据,但是我无法更新UI中的titleText属性,即使它在主队列上。

我可以更新viewDidLoad方法中的属性,所以我感觉这与异步请求有关。

然而,我已经尝试了多种方法,但都没有成功,因此任何帮助都将不胜感激。

代码语言:javascript
复制
- (void) fetchData
{    
    NSString *strURl = @"www.url.com";
    NSLog(@"%@",strURl);

    NSURLSession *session = [NSURLSession sharedSession];
    [[session dataTaskWithURL:[NSURL URLWithString:strURl]
            completionHandler:^(NSData *data,
                                NSURLResponse *response,
                                NSError *error) {

                if (data == nil) {
                    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"error", nil)message:NO_CONNECTION_TEXT preferredStyle:UIAlertControllerStyleAlert];

                    UIAlertAction* ok = [UIAlertAction actionWithTitle:NSLocalizedString(@"ok", nil) style:UIAlertActionStyleDefault handler:nil];
                    [alertController addAction:ok];
                    [self presentViewController:alertController animated:YES completion:nil];

                    return ;
                }
                else
                {
                    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

                        if (!parsedDetails){
                            parsedDetails = [[NSMutableArray alloc]init];
                        }

                        parsedDetails = [provider parseJSON:data into:parsedDetails withResponse:response];
                        NSLog(@"%@",parsedDetails);

                        dispatch_async(dispatch_get_main_queue(), ^{
                            NSLog(@"%@",parsedDetails);
                            NSLog(@"%@",[parsedDetails valueForKey:@"title"]);
                            self.titleText = [parsedDetails valueForKey:@"title"];
                        });
                    });
                }

            }] resume];
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-03 00:57:53

第1部分:确定标题

parsedDetails是代码中的NSMutableArray

然后在该数组上使用KVC (键值编码)方法valueForKey

但这确实会返回一个新的数组。发生了什么:原始数组(parsedDetails)中每个元素的title属性值作为新元素插入到一个新数组中,该数组最终作为数组返回。

由于你上面的评论:

代码语言:javascript
复制
NSLog(@"%@",[parsedDetails valueForKey:@"title"]);

给出返回值(只有一个字符串的数组):

代码语言:javascript
复制
("About") 

但是您实际需要的是第一个条目的title元素,所以应该是这样的:

代码语言:javascript
复制
Detail *detail = parsedDetails.firstObject;
if (detail) {
    title = [detail title];
} else {
    title = @"default empty title";
}

或者,如果您更喜欢KVC变体:

代码语言:javascript
复制
id detail = parsedDetails.firstObject;
if (detail) {
    title = [detail valueForKey:@"title"];
} else {
    title = @"default empty title";
}

第2部分:更新标签

据我所知,您有一个名为titleTextNSString属性?大概定义如下:

代码语言:javascript
复制
@property (nonatomic, strong) IBOutlet NSString *titleText;

你在什么地方也有UILabel插座?

代码语言:javascript
复制
@property (weak, nonatomic) IBOutlet UILabel *label;

如果您只更新本地字符串,它将不会反映在UI中。你还需要把它转移到标签上。

这看起来像这样:

代码语言:javascript
复制
self.label.text = self.titleText;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50656730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档