菜鸟教程小白 发表于 2022-12-13 00:41:06

iphone - 异步网络请求半崩溃应用


                                            <p><p>所以每当我的 ViewController 被加载时,我都会上传到服务器。不过好像有问题。当有大量异步请求时,它可能会使应用程序半崩溃。我的意思是请求不会通过,并且没有其他请求(在另一个线程上)继续。最重要的是,键盘非常滞后(我知道很奇怪)。无论如何,考虑到其他网络请求不会因此而被发送,这是一个严重的问题。我觉得奇怪的是,上传请求的数量与下载请求的数量相同(上传甚至什么都不做,它们只是发出一个普通的 http 请求),但下载请求在任何数量下都可以正常工作。这是我的代码:</p>

<pre><code>- (void)serverUploadAll:(myEntity *)send
{
    NSMutableString *urlString = [ initWithString:ServerApiURL];
    NSString *addTargetUrl = ;
    ;

    NSURL *url = ;
    NSURLRequest *request = ;

    [NSURLConnection sendAsynchronousRequest:request queue:queueTwo completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){
      //NSLog(@&#34;response=%@&#34;, response);
      //NSLog(@&#34;data=%@&#34;, data);
      //NSLog(@&#34;error=%@&#34;, error);
    }];

}
</code></pre>

<p>上面的代码在数据库循环中被调用,当有大量调用时出现问题,即120+。我的下载请求实际上是使用 AFNetworking 完成的,所以也许这就是它们高效工作的原因。无论如何,总结一下,为什么上面的代码被多次调用时,它只是卡住了,然后停止了?</p>

<p>感谢您的帮助,非常感谢。 <br/>
问候,<br/>
迈克</p>

<p><strong>更新:</strong>因此,感谢 runmad 的出色回答,我正在使用 AFNetworking 方法,但是,它因以下错误而崩溃 <code>-: unrecognized selector sent到实例</code>。我不明白为什么这不起作用,这是我的代码:</p>

<pre><code>- (void)cycleThroughEntries
{
MyEntity *myEntity;
NSMutableArray *urlRequests;
urlRequests = [ init];

for (id i in fetchedResultsController.fetchedObjects) {
    myEntity = i;
    NSMutableString *urlString = [ initWithString:ServerApiURL];
    NSString *addTargetUrl = ;
    ;
    //NSLog(@&#34;URL sent is: %@&#34;, urlString);
    NSURL *url = ;
    NSURLRequest *request = ;
    AFHTTPRequestOperation *requestOperation = [ initWithRequest:request];
    ;
}

AFHTTPClient *client = [ initWithBaseURL:];

[client enqueueBatchOfHTTPRequestOperationsWithRequests:urlRequests
                                        progressBlock:^(NSUInteger numberOfCompletedOperations, NSUInteger totalNumberOfOperations) {

                                          NSLog(@&#34;%d / %d&#34;, numberOfCompletedOperations, totalNumberOfOperations);

                                        }
                                        completionBlock:^(NSArray *operations) {
                                          NSLog(@&#34;All Done!&#34;);
                                        }];

}
</code></pre>

<p>不完全确定出了什么问题,因此非常感谢您的帮助。谢谢。</p>

<p><strong>更新 2:</strong> 已修复。我不应该制作一个 <code>AFHTTPRequestOperations</code> 数组,而应该只是普通的 <code>NSURLRequests</code>。问题解决了!!</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您可以建立的异步连接数量是有限制的——即使它们发生在后台线程上。同时进行 120 多个网络调用听起来有点疯狂,尤其是如果它们包含比 GET 请求更长的上传时间。</p>

<p>我建议您考虑重写您需要请求/上传到服务器的内容以减少请求数量。您需要确保所有调用不会同时发生,并且您会推迟大多数调用,直到其他调用完成。</p>

<p>输入 <code>NSOperationQueue</code>...</p>

<p>我会创建一个管理器类来处理您的所有请求。在此类中,您将创建一个 <code>NSOperationQueue</code>,您可以在其中不断向其添加请求。 <a href="http://www.cimgf.com/2008/02/16/cocoa-tutorial-nsoperation-and-nsoperationqueue/" rel="noreferrer noopener nofollow">Here&#39;s a good tutorial</a> .您可以设置并发请求的数量,NSOperationQueue 将确保队列中的下一个请求等到当前正在运行的请求完成。它在网络方面为您做了很多繁重的工作。</p>

<p>您也可以考虑看看 <a href="https://github.com/AFNetworking/AFNetworking" rel="noreferrer noopener nofollow">AFNetworking</a>的 <code>NSOperationQueues</code> 将所有网络调用排队,这样它们就不会同时发生。</p>

<p>在 AFNetworking 的 <code>AFHTTPClient</code> 中,根据您设置请求的方式,您可以使用以下方法:</p>

<pre><code>- (void)enqueueBatchOfHTTPRequestOperationsWithRequests:(NSArray *)urlRequests
                                          progressBlock:(void (^)(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations))progressBlock
                                        completionBlock:(void (^)(NSArray *operations))completionBlock;
</code></pre>

<p>这应该让你开始 :) 祝你好运。</p>

<p><strong>更新</strong></p>

<p>如果需要,您还可以将操作添加到 AFNetworking 操作队列。如果它当前尚未运行,您只需确保启动它。这样,您就可以在不同时间从应用程序的其他部分添加其他请求。您可以随时检查是否有任何操作正在运行/在队列中,令人敬畏的是,它允许您轻松取消任何正在运行的操作。可以找到<a href="https://github.com/AFNetworking/AFNetworking/blob/master/AFNetworking/AFHTTPClient.m#L183" rel="noreferrer noopener nofollow">here</a> .</p></p>
                                   
                                                <p style="font-size: 20px;">关于iphone - 异步网络请求半崩溃应用,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/14584020/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/14584020/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iphone - 异步网络请求半崩溃应用