在进入下一行代码之前,如何让我的程序等待异步NSURLConnection完成?
SetDelegate *sjd= [SetDelegate alloc]; NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:post delegate:sjd]; [connection start];
这是我如何开始连接,我处理在委托中收到的数据,但是我想等待连接结束,然后继续进行,主要是因为这是一个for循环,并且必须为数据库中的每个元素运行.
我需要将数据从手机数据库放到远程数据库,数据成功放入手机数据库中的数据后就被删除.我正在通过手机数据库中的每个元素,并开始一个连接,这就是为什么我看不到下一个可以从循环中完成的内容.我是一个初学者,当谈到Objective-C编程,所以我不知道这是否是正确的方式或不做
使呼叫同步不是一个选项,因为它阻止程序,我有一个应该显示的进度条.
解决方法
你的问题有点奇怪.你不可能限制这个问题.你不能有一行代码“等待”一个进程完成w / o它阻止某些东西,在这种情况下是循环运行的线程.
你可以使用同步调用,如果你不想阻止你的应用程序,它只阻止执行它的线程.在你的例子中,你有一个不断获得远程数据的循环,你希望你的UI反映出来,直到完成.但你不希望你的UI被阻止.这意味着,这个线程与你的循环已经必须在一个后台线程,所以你可以随意做一个同步的调用在循环w / o阻止您的UI线程.如果循环在UI线程上,则需要将其更改为执行所需的操作.
您也可以使用异步连接来执行此操作.在这种情况下,您的操作可能会实时完成更快的b / c,您可以同时进行多个请求.如果您这样做,您的循环可以保留在UI线程上,您只需要跟踪所有连接,以便在完成后,您可以将该状态传达给相关的控制器.您需要使用iVar来跟踪加载状态,并在加载完成时使用协议或NSNotification进行通信.
编辑:在背景技术上同步呼叫的添加示例
如果您希望循环完成,只有当所有请求完成,而不是阻止您的UI线程这里的一个简单的例子:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{ // post an NSNotification that loading has started for (x = 0; x < numberOfRequests; x++) { // create the NSURLRequest for this loop iteration NSURLResponse *response = nil; NSError *error = nil; NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; // do something with the data,response,error,etc } // post an NSNotification that loading is finished });
无论任何对象需要显示加载状态,都应该遵守并处理您在此发布的通知.循环将在后台线程上同步进行所有请求,并且您的UI线程将被解除阻塞和响应.这不是唯一的方法,事实上,我会使用异步连接本身,但这是一个简单的例子,如何获得你想要的.