ios – 在继续下一个命令之前如何使程序等待异步NSURLConnection完成?

在进入下一行代码之前,如何让我的程序等待异步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线程将被解除阻塞和响应.这不是唯一的方法,事实上,我会使用异步连接本身,但这是一个简单的例子,如何获得你想要的.

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...