ios - 3g 慢到无法使用的地步 - 在 wifi 上很好

标签 ios json performance 3g

我的 iOS 应用程序向服务器发出请求,使用 php 脚本访问数据库,并发回一些数据。数据库命中非常简单,只需根据唯一键获取一些数据。

它在 wifi 上工作正常(延迟不到一秒),但在 3g 上慢到无法使用的程度。谁能告诉我可能是什么原因,或者我可以在哪里探索更多?我想像 facebook 或 googlemaps 这样的应用程序比我正在做的数据密集得多,但它们似乎响应速度更快。 我可能向服务器发送不超过 20-30 个字符(加上 JSON 添加的任何开销),然后返回约 500-1000 个字符(加上 JSON 添加的任何开销)。

我正在同步发送内容,但我不认为异步对我没有帮助...无论如何,在我收到消息之前数据不会出现。

我的发送和接收代码是:

+ (id)queryDBJSON:(NSString*)script inputs:(id)post
{
    NSError *error;
    NSData *jsonPayload = [NSJSONSerialization dataWithJSONObject:post options:NSJSONWritingPrettyPrinted error:&error];

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@", script]];

    NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];
    [theRequest setHTTPMethod:@"POST"];
    [theRequest setHTTPBody:jsonPayload];

    NSHTTPURLResponse* urlResponse = nil;
    NSData *responseData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&urlResponse error:&error];
    if ([urlResponse statusCode] != 200)
    {
        return nil;
    }

    NSString *strResult = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    NSData *jsonData = [strResult dataUsingEncoding:NSUTF8StringEncoding];

    id aa = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
    return aa;
}

感谢您的任何意见!

最佳答案

这些情况下的问题不是网络带宽,而是网络延迟(一个小请求仍然需要很长时间)。不幸的是,您无法解决网络延迟问题。因此,有几点观察:

  1. 正如 rmaddy 所说,您只需异步执行网络操作(通过后台队列中的同步调用或使用异步方法)。如果您不这样做,并且您的应用程序无法及时响应,您不仅会遭受具有 Not Acceptable 延迟的用户体验,而且如果时间足够长,iOS 甚至可能会终止您的应用程序。如果您不希望 iOS 在网络延迟较高时杀死您的应用,则必须使用异步网络操作。

  2. 除了执行异步网络操作这一明显(且必要)的解决方案之外,您通常会缓存以前的结果集(因此,而不是仅仅向用户显示 UIProgressView 并停止与您的应用的所有交互在异步调用完成之前,您可以向用户显示最后的良好结果)。如果你查看像 Facebook 这样的应用程序(或者,实际上,任何与网络交互的运行良好的应用程序),你会发现它们会向你显示你上次访问该页面时看到的内容,它们会为你提供一些视觉指示,表明进一步的网络操作正在进行中(例如,至少,状态栏中旋转的网络事件指示器),并且当新结果通过网络传入时,它们会相应地更新 View 。

  3. 一种更复杂的方法是在应用启动后立即启动用户后续操作所需的异步网络请求(而不是等到用户导航到需要该网络数据的屏幕) .这仅适用于用户导航到应用的不同部分需要发出不同网络请求的情况,但在这些情况下,这是将用户与网络延迟隔离开来的好方法。

  4. 如果您绝对不能为类似 Facebook 的用户体验缓存以前的结果集,那么仍然可以异步执行您的网络操作,但会向用户呈现一个用户界面,清楚地表明网络操作正在进行中(例如UIProgressView 可能在黑色 UIView 上有 50% 的 alpha 覆盖屏幕的其余部分)。这给用户一个视觉指示,表明您的应用程序在网络操作完成之前无法显示结果。而且由于您是异步执行操作,iOS 不会终止您的应用。

关于ios - 3g 慢到无法使用的地步 - 在 wifi 上很好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15723072/

相关文章:

ios - 带有包含自定义单元格的 UITableView 的 UISearchBar => 空白单元格

ios - 在 iOS 中使用未声明类型的 AudioDeviceID

ios 以编程方式推送 Controller View ,无需 Storyboard或 xib

ios - AWS S3 HeadObject 无法解析 Dispatch_Once

使用 GSON 将 Java 复杂对象转为 JSON

c++ - 为什么在 glsl 中使用实例化时纹理缓冲区比顶点输入快?

arrays - postgresql Json 路径功能

php - 试图在 php 数组中获取非对象的属性

javascript - jquery.inArray() 与 Object.hasOwnProperty() 之间的性能差异?

mysql - 缓慢的 mysql 查询,复制到 tmp 表,使用文件排序