gpt4 book ai didi

ios - NSOperationQueue 批处理 SLRequests

转载 作者:行者123 更新时间:2023-11-29 13:05:21 27 4
gpt4 key购买 nike

你好,对于我正在处理的项目,我必须在后台执行 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 的最佳方法。非常感谢任何建议/更正

最佳答案

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

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

否则,该方法是可行的。

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

NSOperationQueue 有一个属性 maxConcurrentOperations,它默认等于 CPU 的数量。

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

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

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

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

结论:

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

把它留在两个,然后开心。 ;)

关于ios - NSOperationQueue 批处理 SLRequests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18779805/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com