在 nsoperation 内部使用 Runloop 执行异步任务
Using Runloop in inside nsoperation for async tasks
我有一个用例,我需要使用 NSURLSession 下载很多文件。
为了防止会话任务超时,我需要将它们放在一个操作队列中并限制并发下载量,这样它们就不会饿死。
我的想法是,我将任务恢复加载到一个nsoperation中,并将它们加载到一个nsoperationqueue中,该队列将限制并发activitiy的数量。
问题是,当我调用 [task resume] 时,代码将退出并且 nsoperation 将认为自己完成,即使我正在等待文件完成下载。
这是一些代码。
NSURLSessionDownloadTask *task = [session downloadTaskWithRequest: request
completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
//move the file to a permanent location
CFRunLoopStop(CFRunLoopGetCurrent());
}
//I have instantiated a class global NSOperation queue.
[imageDownloadQueue addOperationWithBlock:^void() {
[task resume];
CFRunLoopRun();
}];
如何在等待回调时让 nsoperation 线程保持活动状态?我也尝试过使用 nsrunloop 并向 NSMachPort 添加一个端口。这似乎没有帮助。
此外,在 NSURLSession 上设置 HttpMaximumConnectionsPerHost 也没有帮助,因为超时计时器在我恢复任务时启动。这意味着我将获得比以前更多的超时。
遗憾的是,我没有时间进行适当的修复,我需要尽快修复超时问题。我找到了一些有用的东西。
//I have instantiated a class global NSOperation queue.
[imageDownloadQueue addOperationWithBlock:^void() {
[task resume];
while(task.state == NSURLSessionTaskStateRunning)
{
[NSThread sleepForTimeInterval:.1];
}
}];
由于 NSOperation 在后台线程上工作,因此我能够在任务 运行ning 时休眠该线程。这可以防止线程死亡,但任务将 运行 在它自己的线程上并且不会被阻塞。
我有一个用例,我需要使用 NSURLSession 下载很多文件。
为了防止会话任务超时,我需要将它们放在一个操作队列中并限制并发下载量,这样它们就不会饿死。
我的想法是,我将任务恢复加载到一个nsoperation中,并将它们加载到一个nsoperationqueue中,该队列将限制并发activitiy的数量。
问题是,当我调用 [task resume] 时,代码将退出并且 nsoperation 将认为自己完成,即使我正在等待文件完成下载。
这是一些代码。
NSURLSessionDownloadTask *task = [session downloadTaskWithRequest: request
completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
//move the file to a permanent location
CFRunLoopStop(CFRunLoopGetCurrent());
}
//I have instantiated a class global NSOperation queue.
[imageDownloadQueue addOperationWithBlock:^void() {
[task resume];
CFRunLoopRun();
}];
如何在等待回调时让 nsoperation 线程保持活动状态?我也尝试过使用 nsrunloop 并向 NSMachPort 添加一个端口。这似乎没有帮助。
此外,在 NSURLSession 上设置 HttpMaximumConnectionsPerHost 也没有帮助,因为超时计时器在我恢复任务时启动。这意味着我将获得比以前更多的超时。
遗憾的是,我没有时间进行适当的修复,我需要尽快修复超时问题。我找到了一些有用的东西。
//I have instantiated a class global NSOperation queue.
[imageDownloadQueue addOperationWithBlock:^void() {
[task resume];
while(task.state == NSURLSessionTaskStateRunning)
{
[NSThread sleepForTimeInterval:.1];
}
}];
由于 NSOperation 在后台线程上工作,因此我能够在任务 运行ning 时休眠该线程。这可以防止线程死亡,但任务将 运行 在它自己的线程上并且不会被阻塞。