我一直在努力解决这个问题一个多星期。我真的需要一些帮助。
我正在使用ASIHTTPRequest
来处理三种不同的下载请求。第一个下载请求将从在线.txt文件下载时间戳。根据该时间戳,它必须处理应用程序的启动方式。
它将检查时间戳是否先前已保存在NSUserDefaults
中,如果没有,那么这是第一次启动应用程序,它将下载JSON提要(使用ASIHTTPRequest
)然后解析它进入核心数据。
如果存储的时间戳与在线时间戳匹配,则由于数据是最新的,因此没有任何反应。
如果存储的时间映射早于在线时间戳,则数据库将被清除并重新加载。
我的问题是,在ASIHTTPRequest
中,requestFinished
执行之前,application:didFinishLaunchingWithOptions
会被执行到最后。现在在application:didFinishLaunchingWithOptions
的开头,我要ASIHTTPRequest
下载在线时间戳。在application:didFinishLaunchingWithOptions
结束之前,我需要下载在线时间戳并准备好使用。我该怎么办? ASIHTTPRequest
的问题在于它在application:DidFinishLaunchingWithOptions
结束后开始执行。
答案 0 :(得分:8)
如果没有一些代码可以看,我们的答案必须相当普遍。但听起来我觉得你需要完全改变你的启动流程。
如果您的http请求按顺序发生很重要,您需要按顺序调用它们 - 嵌套在彼此的完成委托方法中。您可以使用ASIHTTPRequest的.userInfo
字段来识别您正在触发的不同类型的请求。
您的didFinishLaunching
方法应该做得足以让您的第一个请求开始(并且可能会显示“加载”视图),然后应用程序启动工作的其余部分需要在各种{{1方法。
如果您也控制了网站方面的内容,您可能会看到有多少工作可以卸载到服务器代码中。我更喜欢用我能找到的最大的铁来做我的工作,这意味着我通常在我的网络应用程序中进行数据处理,然后将结果发送到手机。
编辑:这里有一些代码来描述“嵌套在彼此的完成方法中”的意思。请注意,我只是在这里输入了这个,所以不要只是复制并粘贴它,并期待任何明智的行为。
requestDidFinish
因此,您使用userInfo字段设置一个标识它的请求,然后根据该字段区分其响应的处理。无论如何,这在视图控制器中使用多个ASIHTTPRequest是基本的。
然后您的下一个请求基于第一个请求的响应 - 您在了解了您需要从第一个响应内容中学习的内容后启动了第二个请求。
顺便说一下,您还可以指定完成处理程序方法,或使用块接口指定ASIHTTPRequest在完成时执行的操作。但我认为通过识别userInfo字段来加载您的请求,然后在一个地方处理您的响应是最干净的方法。
答案 1 :(得分:2)
你不能这样做。您遇到的问题是请求是异步的。您无法将其更改为同步,因为如果有任何网络延迟,iOS将终止该应用程序,因为加载时间过长。
将其余的应用程序启动代码放在请求的完成处理程序中。请求完成后,它将调用完成处理程序。
答案 2 :(得分:0)
正如Jim正确指出的那样,问题在于对服务器的异步请求。 “application:didFinishLaunchingWithOptions”方法在进行异步服务器调用后继续执行。您的服务器请求可能需要一些时间,到那时“application:didFinishLaunchingWithOptions”方法可能不在其循环中。因此,只有解决方案才能对服务器进行同步调用并使“application:didFinishLaunchingWithOptions”等待服务器响应响应,然后继续执行下一条指令。您可以使用ASIHTTPRequest的“startSynchronous”方法实现此目的。