使用 RESTful API 时更新 UI

Posted

技术标签:

【中文标题】使用 RESTful API 时更新 UI【英文标题】:Updating UI in when consuming RESTful API 【发布时间】:2016-08-11 00:57:55 【问题描述】:

我的 UI 在一个视图控制器中使用滚动视图和分页以及 UITableView。为了加载 UI,我使用了一组 NSDictionaries (sourceArray),其中包含绘制 UI 的必要信息。该数组是通过使用返回记录数组的 RESTful API 创建的。我在完成处理程序中返回该数组。后来我将该数组与其他一些键:值对一起添加以创建 NSDictioary,稍后将其添加到 sourceArray 以进行 UI 绘图。

现在我的问题是如何根据 sourceArray 的变化更新我的 UI。我打电话给 [self.view layoutIfNeeded];但它不会强制重绘。

- (void)getStateDetails 
NSArray *statesArray = [self getStates];
for (NSString *state in statesArray) 
    [self getStateDetailsInState:state withCompletionBlock:^(NSArray *records) 
        NSLog(@"%@",records);

        NSDictionary *dict = @
                               @"kImage": state,
                               @"kName": state,
                               @"kRecord": records
                              ;
        [self.sourceArray addObject:dict];
        dispatch_async(dispatch_get_main_queue(), ^
            [self.view layoutIfNeeded];
        );

    ];


界面细节-

Viewcontroller 包含 UIScrollView,其中包含使用动态数据的各种 UIView 和包含动态数据的 UITableView。

这就是我当前 UI 的样子。

【问题讨论】:

告诉我们您的 UI 是什么样的,以及您希望如何显示新下载的数据。如果没有这些信息,我们只能猜测。 @DuncanC UI 细节已添加。 【参考方案1】:

对 layoutIfNeeded 的调用将触发您的视图检查它们是否需要更新其布局。更改数组的内容不会导致视图的布局需要更新,因此对 layoutIfNeeded 的调用不太可能执行任何操作。

为了让我们帮助您使用您加载的字典来更新您的 UI,您必须告诉我们您希望新数组元素对您的 UI 进行哪些更改。

一种常见的做法是在表格视图或collectionView 中显示数组的内容。在这种情况下,您将调用表格/集合视图的 reloadData() 函数,这将导致它询问其数据源的条目数并重新渲染它的所有单元格。

编辑

好的,您下载的数据和您的 UI 之间有什么关系?您编写的哪些代码应该会导致 UI 更新?您已经更改了数组,但没有显示任何代码来告诉您的视图对象有关更新的数据。

对于表格视图,这可能就像上面提到的调用reloadData 一样简单。对于其他视图,您的数据如何显示到这些视图中?应该用什么机制将新数据安装到这些视图中?

【讨论】:

绝对reloadData() 是这里所缺少的。 @brandonscript,仅当正在获取的数据应该显示到表格视图或集合视图中时。【参考方案2】:

让视图重新绘制自身的最简单方法是调用[UIView setNeedsDisplay] 或使用[UIView setNeedsDisplayInRect]。这个方法告诉视图它需要重新绘制自己和它的子视图。但是,您不必总是调用它。还有其他方法可以导致视图自身重绘。例如,如果您使用 [UIView addSubview:][UIView removeFromSuperview] 在视图层次结构中添加或删除视图。

这些方法会导致系统调用您视图的 drawInRect: 方法(假设您使用自定义绘图代码覆盖它)。如果您没有为自定义绘图覆盖此方法,那么它应该会导致您的子视图收到相同的消息,以便它们有机会重绘。

这里有更多信息。具体阅读标有“视图绘图周期”的部分。

http://developer.apple.com/library/ios/#documentation/uikit/reference/uiview_class/uiview/uiview.html

您可以在其中添加观察者并强制调用控制器重新加载的 *** 帖子之一 How to reload UIViewController

【讨论】:

【参考方案3】:

你必须使用[tableView reloadData],如果需要的话

            [self.view layoutSubviews]; 
            [self.view setNeedsDisplay];
            [self.view setNeedsLayout];

【讨论】:

以上是关于使用 RESTful API 时更新 UI的主要内容,如果未能解决你的问题,请参考以下文章

我的RESTful API没有更新数据库,但是ajax返回成功

如何设计一个restful风格的API

HTTP Restful 语义版本控制

restful api与传统api的区别(方式及语法)

在 RESTful API 中访问对象的版本/修订

Feign 接入第三方restful api 入门