您好,对于我正在处理的一个项目,我必须在后台执行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的最佳方法。如有任何建议/更正,我们将不胜感激
发布于 2013-09-13 16:28:06
您的完成处理程序不会像您预期的那样工作:因为所有请求都是异步启动的,所以您会立即到达if (completion) { completion(); }语句-但还没有完成任何操作。
有许多方法可以处理这种异步模式。目标是用信号通知一些异步任务的完成。一种简单的方法是设置一个计数器,它最初等于任务的数量。每当一个任务完成(或失败)时,计数器递增1(小心同步,例如在专用队列或主线程上执行)。当计数器达到零时,调用完成处理程序。
否则,这种方法是可行的。
但是,您可能希望显式控制底层网络层执行的并发请求的最大数量。如果延迟是一个问题,您应该增加并发请求的数量。
NSOperationQueue有一个属性maxConcurrentOperations,该属性默认等于CPU的数量。
最大并发请求数可能是两个(对于CPU限制的队列和两个核心)。在您的场景中,无论如何这都是可以的。但是,并发请求的最佳数量取决于许多因素,这些因素可能超出您的控制范围:例如,服务器或连接质量。
如果你有非常大的数据要传输,我会设置为1-因为限制因素是带宽-而不是延迟。
否则,最多4个或5个。并发请求越多,应用程序中使用的内存就越多!
注意:NSULRConnection可能会强制限制最大并发请求数,这也取决于主机或IP或其他因素。
结论:
给定一个具有平均连接质量的平均环境,如果您尝试使用大量并发请求进行优化,用户将不会注意到太多的改进。但是设置一个较高的数值会增加你的应用程序由于内存问题而阻塞的风险。
把它留在两点,然后快乐起来。;)
https://stackoverflow.com/questions/18779805
复制相似问题