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

问题描述:

好吧,这可能是一个非常简单的问题,需要一个非常明显的答案,但我有点卡在解决这个问题的最佳方式。如何在等待NSURL连接完成时阻止objective-c方法执行?

我正在编写一个使用iPhone SDK的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(与其他高延迟对象一样)可让您遵循此模式。创建连接时设置delegate,并在结果数据可用时调用某些方法的委托。这样,您可以通过使委托方法仅在第一个操作完成时开始第二个操作来序列化操作。

+0

本,你是绝对正确的。通常回拨功能将是这里的方式。我想我需要在这里考虑更多的实现。 基本上我所希望的是一种具有某种超时的同步连接。最终目标是拥有一个可以进行Web服务调用的Client对象,如果在短时间内没有响应返回,则会触发错误。如果响应返回,则会发生UI操作,并可能触发另一个请求。但是,当我们正在等待数据或错误时,我无法拨打其他电话。队列可能? – Hazmit 2010-02-05 07:00:27

+0

这个答案是正确的,你应该立即返回。之后处理响应的回调函数负责处理数据或显示错误。这个概念被称为事件驱动编程。 http://en.wikipedia.org/wiki/Event-driven_programming – Jacob 2010-02-05 07:36:33

+0

+1超级定义的同步,异步和回拨 – 2013-01-25 10:48:08

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

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

sendSynchronousRequest:returningResponse:error: 

这苹果类的文档中找到了NSURLConnection的

http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html#//apple_ref/occ/clm/NSURLConnection/sendSynchronousRequest:returningResponse:error