2

您好,对于我正在处理的项目,我必须在后台执行 n-SLRequest,所以我需要将这些请求添加到 NSOperationQueue,如下面的代码所示

- (void)performBatchRequest:(void(^)(void))completion
{
   NSURL *url = [NSURL URLWithString:@"https://api.twitter.com/1.1/direct_messages/new.json"];

   NSOperationQueue *queue = [[NSOperationQueue alloc] init];

   ACAccount *account = [self getStoredAccount];

   for (NSDictionary *user in self.inviteList)
   {
    [queue addOperationWithBlock:^
    {
        NSDictionary *params = @{@"screen_name" :user[@"name"],@"text":@"message" }

        SLRequest *inviteRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter
                                                      requestMethod:SLRequestMethodPOST
                                                                URL:url
                                                         parameters:];

        [inviteRequest setAccount:account];

        [inviteRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error)
        {
            if (error)
            {
                NSLog(@"Errror");
            }
        }];
    }];
   }
   self.inviteList = nil;
   if (completion)
   {
      completion();
   }
}

现在我想知道这是否是我可以用来在后台执行多个 SLRequest 的最佳方法。非常感谢任何建议/更正

4

1 回答 1

1

您的完成处理程序不会像您期望的那样工作:由于请求都是异步启动的,您会立即到达if (completion) { completion(); }语句 - 但还没有完成任何事情。

有许多方法可以处理这种异步模式。目标是发出许多异步任务完成的信号。一种简单的方法是设置一个最初等于任务数量的计数器。每当一项任务完成(或失败)时,将计数器加一(仔细同步,例如在专用队列或主线程上执行)。当计数器达到零时,调用您的完成处理程序。

否则,该方法是可行的。

但是,您可能希望显式控制底层网络层执行的最大并发请求数。如果延迟是一个问题,您应该增加并发请求的数量。

NSOperationQueue具有maxConcurrentOperations默认等于 CPU 数量的属性。

最大并发请求可能是两个(对于 CPU 绑定队列和两个内核)。无论如何,在您的情况下,这恰好是可以的。但是,并发请求的最佳数量取决于许多因素,这些因素可能超出您的控制范围:例如服务器或连接质量。

如果您有非常大的数据要传输,我会设置为 1 - 因为限制因素是带宽 - 而不是延迟。

否则,最多 4 或 5 个。并发请求越多,您的应用程序使用的内存就越多!

注意:NSULRConnection可能会强制设置最大并发请求的上限,这也取决于主机或 IP 或其他因素。

结论:

给定具有平均连接质量的平均环境,如果您尝试使用大量并发请求进行优化,用户不会注意到很大的改进。但是设置一个较高的数字会增加您的应用因内存问题而阻塞的风险。

把它留在两点,并且快乐。;)

于 2013-09-13T08:28:05.640 回答