【问题标题】:Slow on 3g to the point of unuseable - fine on wifi在 3g 上慢到无法使用 - 在 wifi 上很好
【发布时间】:2013-03-30 20:20:53
【问题描述】:

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

它在 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;
}

感谢您的任何意见!

【问题讨论】:

  • 永远不要在主线程上进行网络调用。时期。在后台进行网络连接。获得结果后,在主线程上更新 UI。

标签: ios json performance 3g


【解决方案1】:

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

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

  2. 1234563完成后,您可以向用户展示最后的好结果)。如果您查看诸如 Facebook 之类的应用程序(或者,实际上,任何与网络交互的执行良好的应用程序),您会发现它们向您展示了您上次访问该页面时所看到的内容,它们为您提供了进一步网络的视觉指示操作正在进行中(例如,至少,状态栏中的旋转网络活动指示器),当新结果通过网络进入时,它们会相应地更新视图。
  3. 一种更复杂的方法是在应用程序启动后立即启动用户后续操作所需的异步网络请求(而不是等到用户导航到需要该网络数据的屏幕) .这仅适用于用户导航到需要发出不同网络请求的应用的不同部分的情况,但在这些情况下,这是一种将用户与网络延迟隔离开来的绝妙方法。

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

【讨论】:

  • 谢谢。我在 3G 上遇到了同样的问题……我已经怀疑这是因为 延迟,因为请求本身非常快,我后来发现。我现在正在执行您在 2. 中描述的操作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 2012-03-05
相关资源
最近更新 更多