• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 尝试管理大型 UITableView 数据结构

[复制链接]
菜鸟教程小白 发表于 2022-12-12 23:10:31 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我有一个 UINavigationController 从 Web 服务获取项目。我调用 Web 服务 - 它检查是否有更多项目要加载 - 如果有 - 我使用来自 Web 服务的新数据加载相同 viewController 的新实例。这很好用。

我还要做的是显示一个“正在加载”屏幕,它再次显示同一 View Controller 的另一个实例,其中只有一个 UITableViewCell 表示正在加载。这提供了良好的体验,并且在 Web 服务繁忙时不会锁定 UI。

当没有更多要显示的项目时(只有在 Web 服务返回后才能知道这一点)我将一个新的 View Controller 推送到堆栈上 - 我们称之为 viewControllerB

所以它是这样工作的:

当我们从 Web 服务返回更多项目时:

UITableViewCell 已点击 -> Web 服务调用 开始 -> 当前 viewControllerA 的新实例使用“Loading cell”插入堆栈 -> 来自 WebService 的 more items - 用更多数据重新加载 viewController 的当前实例。

当我们没有从 Web 服务取回项目时:

UITableViewCell 已点击 -> Web 服务调用 开始 -> 当前 viewControllerA 的新实例使用“Loading cell”插入堆栈 -> no more items 从 WebService -push 到 viewControllerB

现在的问题是,当我从 viewControllerB 返回到 viewControlerA 时,我得到了“正在加载更多”屏幕,并且必须再返回一个级别到最后一组结果是 viewControllerA

如何绕过加载屏幕并直接转到最后的结果?

最后,是否有另一种方法可以在不将同一 View Controller 的新实例加载到堆栈中的情况下做到这一点?同时保留上一个屏幕的数据?



Best Answer-推荐答案


您可以对服务器使用异步请求,该操作将在另一个线程中进行,因此您的应用程序不会卡住主线程。这是一个简单的例子:

-(void) myFuncToServerRequest{

    [self setLoading];

    NSMutableString *post = [NSMutableString stringWithString"mykey="];
    [post appendString"myValue"];

    NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
    NSString *postLength = [NSString stringWithFormat"%lu",(unsigned long)[postData length]];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];

    NSString *urlApi = @"yoursite.com";

    [request setValue:postLength forHTTPHeaderField"Content-Length"];
    [request setValue"application/x-www-form-urlencoded" forHTTPHeaderField"Content-Type"];
    [request setHTTPBody:postData];
    [request setHTTPMethod"OST"];

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){
        [self unselectLoading];
        if (error){

        }
        else{
        // return to main thread
        dispatch_async(dispatch_get_main_queue(), ^{
                   // Do what you want with your data
                });


        }
    }];
}

我的键和我的值是请求的参数,您可以在 post 变量中附加更多的键和值字符串。

关于ios - 尝试管理大型 UITableView 数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24304137/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap