隔夜向服务器发出的 iOS 请求,无响应 RestKit

Posted

技术标签:

【中文标题】隔夜向服务器发出的 iOS 请求,无响应 RestKit【英文标题】:iOS Requests to Server Overnight w/ No Response RestKit 【发布时间】:2014-01-28 16:31:23 【问题描述】:

我正在使用一个使用 RestKit 的应用程序(这可能与我遇到的问题相关,也可能不相关),其中应用程序在特定时间间隔后唤醒几秒钟并向服务器发出 managedObjectRequestOperation。这整天都能正常工作,但通常在凌晨 1 点到 7 点之间,当我的设备处于充电状态时,几个小时内没有使用过请求被发送,但我没有注册任何类型的响应。

请求似乎没有超时或任何其他类似错误,我的日志显示我正在发送请求,然后什么也没有发生,没有响应,没有错误...电话是否进入某些一夜之间陷入昏迷?我的设备是运行 ios7 的 iPhone 5。

编辑:

我所做的基本上是向服务器发送请求并使用结果更新核心数据,然后更新 tableView。我最初的实现基本上是向应用程序发送了一个 NSNotification,它告诉 tableview 发送请求并根据结果更新自身,类似于:

-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"RefreshData" object:nil];

    completionHandler(UIBackgroundFetchResultNewData);

什么时候应该这样做:

-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 
    [RefreshDataWithCompletionHandler:(void (^)(id result))completionHandler 
         // handle updating the data here based on the result of the request to the server
         ......

         // then call the completion handler here
         completionHandler(UIBackgroundFetchResultNewData); 
   ];

这是对正确步骤的更准确表示吗?

【问题讨论】:

不太可能与 RestKit 相关,尽管它不使用 iOS 7 会话...您如何触发应用程序在后台运行? 使用后台获取模式调用performFetchWithCompletionHandler 你正在调用由 RestKit 调用的成功块中的完成处理程序?您的请求不到 30 秒? 白天正常后台,调用performFetchWithCompletionHandler时,请求/响应时间小于1秒。截至目前,在完成处理程序中,我广播了一个基本上启动 restkit 请求的 NSNotification。 在完成处理程序中?您应该立即触发请求,并在收到并处理响应时调用完成处理程序。 【参考方案1】:

从讨论中,听起来问题在于如何发出请求以及与完成处理程序的关系。当调用performFetchWithCompletionHandler: 时,应立即启动请求(发布通知对此很好,因为它内联运行)。请求应在 30 秒内完成,然后应在处理接收到的数据后调用提供的完成块(在 RestKit 成功块中也是如此)。

如果您过早调用完成块,应用程序将在发送请求之前(它是异步的)或在收到任何响应之前终止(它将被忽略)。

【讨论】:

我明白你在说什么。我添加了一些代码来显示我最初在做什么以及我现在(基本上)在你的建议下正在做什么。我添加的代码是否更符合正确的实现?我假设一夜之间请求可能只是因为手机处于睡眠状态而需要更长的时间,所以他们永远没有机会处理响应,因为完成处理程序几乎立即杀死它,但它在白天工作,因为它可能更快,而手机处于半活动状态? 代码看起来更好。不知道白天和黑夜的区别。系统确实从以前的请求中学习,因此它可以缩短可用时间。另请注意,您不应总是说有新数据可用(即,如果没有新数据可用),因为这会影响学习算法。 关于该注释的另一个问题 - 当我向服务器发出请求时,服务器上的信息会更新,重要的是服务器知道设备基本上“已签入”......将始终返回新的处理程序中的数据使这些请求或多或少地发生频率? Apple 不会公布学习算法的细节,它是基于许多因素,包括用户使用情况、失败率、所花费的时间......目标是在用户需要之前提供数据它,不允许应用定期签入。

以上是关于隔夜向服务器发出的 iOS 请求,无响应 RestKit的主要内容,如果未能解决你的问题,请参考以下文章

角度不会向节点js rest API发出发布请求

以管理员身份使用自定义令牌向 FB DB 发出 REST 请求

Django REST Framework 发出异步请求以响应

用于模拟响应的 Python Quick Rest API

你今天Restful了吗?

iOS的REST服务-备