在等待NSURL连接完成时,如何防止objective-c方法执行?

在等待NSURL连接完成时,如何防止objective-c方法执行?,objective-c,iphone,nsurlconnection,Objective C,Iphone,Nsurlconnection,好的,这可能是一个很简单的问题,答案很明显,但我有点困在解决这个问题的最佳方法上 我正在使用iphonesdk编写objective-c应用程序。我有一些自定义对象。这些对象执行NSURL请求并将数据发送到web服务器,检索数据并继续 我的问题是,我有一个到我正在验证的服务器的初始请求。如果成功,此请求将返回我将在以下请求中使用的会话的一些信息。如果我想让我的应用程序在启动时进行身份验证,然后发出初始的后续请求,那么我需要来自第一个应用程序的数据来执行第二个应用程序。我的问题是,在objecti

好的,这可能是一个很简单的问题,答案很明显,但我有点困在解决这个问题的最佳方法上

我正在使用iphonesdk编写objective-c应用程序。我有一些自定义对象。这些对象执行NSURL请求并将数据发送到web服务器,检索数据并继续

我的问题是,我有一个到我正在验证的服务器的初始请求。如果成功,此请求将返回我将在以下请求中使用的会话的一些信息。如果我想让我的应用程序在启动时进行身份验证,然后发出初始的后续请求,那么我需要来自第一个应用程序的数据来执行第二个应用程序。我的问题是,在objective-c中,当我向请求对象发送消息以执行请求并将数据返回给变量时;在处理第一个请求时,该语言本质上会继续执行我的方法。我的第二个请求永远不会成功,因为第一个请求尚未返回数据

我不记得这叫什么,但它是运行过程代码、单线程代码与并行处理或其他类似的东西

在发送web请求的对象获得其返回值之前,保持方法执行的最佳方法是什么

我确信有几种方法可以做到这一点,但我正在寻找被认为“合适”的方法

下面是sudo代码示例

//First Request is sent obtaining some data that we will soon manipulate  
MyClient *client = [[MyClient alloc] init];  
NSString *returnData = [MyClient runRequest];  

//Call an object that now plays with the data and does some neat things  
CustomObject *CustomObj = [[CustomObject alloc] init];  
[CustomObj dealWithResponse:returnData];   
//Problem is now when I process the return data, it hasn't completed the first request from line 2 yet  
你说的是“同步”和“异步”操作。同步操作是与调用代码同步发生的操作。Cocoa的大部分工作方式是这样的:向对象发送消息,比如格式化字符串,等等,当代码行“完成”时,操作就完成了

但在现实世界中,有些操作需要的时间比“瞬时”时间长(有些是密集的图形工作,但主要是高延迟或可变延迟,如磁盘I/O或更糟的网络连接)。这些操作是不可预测的,如果代码一直阻塞到完成,它可能会无限期或永远阻塞,这是不好的

所以我们处理这个问题的方法是设置“回调”——你说“去做这个操作,完成后,调用另一个函数”。然后在“回调”函数中,启动依赖于第一个函数的第二个操作。这样,您就不会在等待的过程中打转,而是在每个任务完成时被称为“异步”


NSURLConnection
(与其他高延迟对象一样)允许您遵循此模式。在创建连接时,您设置了一个
委托
,当结果数据可用时,委托将在某些方法上被调用。通过这种方式,您可以通过让委托方法仅在第一个操作完成后才启动第二个操作来序列化操作。

我花了一些额外的时间浏览了NSURLConnection文档,发现了一个允许您提交同步请求的实例方法

Ben对编程概念的回答和评论是完全正确的,应该被认为是对这个问题的真实回答。但是,对于那些确实希望提交同步请求并阻止应用程序执行直到出现响应的人,您可以使用以下方法

sendSynchronousRequest:returningResponse:error:  
这可以在苹果的NSURLConnection类文档中找到


Ben,你说得绝对正确。通常情况下,回调函数将是实现此功能的方法。我想我需要在这里更多地考虑一下实现。本质上,我希望的是一个同步连接,带有某种超时。最终目标是拥有一个可以进行web服务调用的客户机对象,如果在短时间内没有响应返回,它将触发一个错误。若响应返回,则会发生UI操作并触发另一个请求。但是当我们在等待数据或错误时,我不能再打其他电话了。也许吧?这个答案是对的,你应该马上回来。随后处理响应的回调函数负责处理数据或显示错误。这个概念称为事件驱动编程。