草庐IT

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

coder 2024-01-16 原文

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

- (void)serverUploadAll:(myEntity *)send
{  
    NSMutableString *urlString = [[NSMutableString alloc] initWithString:ServerApiURL];
    NSString *addTargetUrl = [NSString stringWithFormat:@"/addtarget?deviceToken=%@&appVersion=%@&targetId=%@", postToServer.deviceToken, postToServer.appVersion, send.Id];
    [urlString appendString:addTargetUrl];

    NSURL *url = [NSURL URLWithString:urlString];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

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

}

上面的代码在数据库循环时被调用,当有大量调用时会出现问题,即 120+。我的下载请求实际上是使用 AFNetworking 完成的,所以也许这就是它们高效工作的原因。不管怎样,总而言之,为什么当多次调用上述代码时它会卡住并停止?

感谢您的帮助,非常感谢。
此致,
迈克

更新:因此,多亏了 runmad 的出色回答,我正在使用 AFNetworking 方法,但是,它因此错误而崩溃 -[AFHTTPRequestOperation _propertyForKey:]: unrecognized selector sent实例。我不明白为什么这不起作用,这是我的代码:

- (void)cycleThroughEntries
{
MyEntity *myEntity;
NSMutableArray *urlRequests;
urlRequests = [[NSMutableArray alloc] init];

for (id i in fetchedResultsController.fetchedObjects) {
    myEntity = i;
    NSMutableString *urlString = [[NSMutableString alloc] initWithString:ServerApiURL];
    NSString *addTargetUrl = [NSString stringWithFormat:@"/addtarget?deviceToken=%@&appVersion=%@&targetId=%@", postToServer.deviceToken, postToServer.appVersion, myEntity.Id];
    [urlString appendString:addTargetUrl];
    //NSLog(@"URL sent is: %@", urlString);
    NSURL *url = [NSURL URLWithString:urlString];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    AFHTTPRequestOperation *requestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    [urlRequests addObject:requestOperation];
}

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@""]];

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

                                            NSLog(@"%d / %d", numberOfCompletedOperations, totalNumberOfOperations);

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

}

不完全确定哪里出了问题,非常感谢您的帮助。谢谢。

更新 2: 已修复。我不应该制作一个 AFHTTPRequestOperations 数组,而只是普通的 NSURLRequests。问题解决了!!

最佳答案

您可以建立多少个异步连接是有限制的 - 即使它们发生在后台线程上。同时进行 120 多个网络调用听起来有点疯狂,尤其是当它们包含比 GET 请求花费的时间更长的上传时。

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

输入NSOperationQueue...

我会创建一个管理器类来处理您的所有请求。在这个类中,您将创建一个 NSOperationQueue,您可以在其中继续向其添加请求。 Here's a good tutorial .您可以设置并发请求的数量,NSOperationQueue 将确保队列中的下一个请求等待当前正在运行的请求完成。它通过网络为您完成了很多繁重的工作。

您也可以考虑看看 AFNetworkingNSOperationQueues 将所有网络调用排队,这样它们就不会同时发生。

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

- (void)enqueueBatchOfHTTPRequestOperationsWithRequests:(NSArray *)urlRequests
                                          progressBlock:(void (^)(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations))progressBlock
                                        completionBlock:(void (^)(NSArray *operations))completionBlock;

这应该让你开始 :) 祝你好运。

更新

如果需要,您还可以将操作添加到 AFNetworking operationsQueue。如果它当前尚未运行,您只需确保启动它。通过这种方式,您可以在不同时间从应用程序的其他部分添加额外的请求。您始终可以检查是否有任何操作正在运行/在队列中,最棒的是它允许您轻松取消任何正在运行的操作。可以查到here .

关于iphone - 异步网络请求半崩溃应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14584020/

有关iphone - 异步网络请求半崩溃应用程序的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  3. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  4. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  5. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  6. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  7. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  8. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  9. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  10. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

随机推荐