我正在学习iOS的并发编程.到目前为止,我已经读过NSOperation
/NSOperationQueue
和GCD
.使用NSOperationQueue
over 的原因是什么GCD
,反之亦然?
听起来像是两者,GCD
并从用户那里NSOperationQueue
抽象出明确的创造NSThreads
.然而这两种方法之间的关系对我来说并不清楚,所以任何反馈都要赞赏!
concurrency nsoperation nsoperationqueue grand-central-dispatch ios
我一直在设计NetworkCommunication
.我有一个设计,其中NSOperation
子类创建和管理自己的NSURLConnection
.该NSOperation
子类由一个实例NetworkManger
,它增加了类NSOperationQueue
.请求完成后,委托人(例如:ViewController
将被调用).这是流程:
Network Manger实例化子NSOperation
类(它封装了URL,参数等)并将其添加到NSOperationQueue
它维护的中.NSOperation子类实例化NSURLConnection
(执行asynchronous
请求并检索数据)
NSURLConnection
将数据转储到NSOperation-subclass NSOperation-subclass执行委托(视图控制器)提供的完成块.我现在正试图实现相同的模式NSURLSession
.我希望能够封装在单个对象中发出网络请求所需的url和参数.
如果我使用相同的模式,是否可以NSURLSession
.我检查了AFNetworking
课程.但是,他们没有将NSOperation子类化NSURLSession
.此外,会话对象应该去哪里.它会成为NSOperation课程的一部分吗?
有人可以就此提出一些专家意见.我应该可以取消请求,上传(POST/PUT),下载数据.Network Manager类将成为任何网络请求的单一联系点.
使用XCode-8.2.1,Swift-3.0.2和iOS-10.2.1,
我正在尝试调用两个不同的URLSession.shared.dataTasks(第一个是简单的URL请求,第二个是POST请求)。
由于我的第一个dataTask提供了第二个dataTask的httpBody中所需的结果,因此两个URLSession.shared.dataTasks应该依次运行,一个接一个地运行!(并且准备代码也应连续运行)。
到目前为止,我尝试使用两个连续的serialQueue.sync{}
队列。但是我必须意识到代码无法按照我想要的顺序执行。
日志中的打印语句如下:
Hmmmmmm 2
Hmmmmmm 1
Hmmmmmm 3
Run Code Online (Sandbox Code Playgroud)
(而不是根据需要的1、2、3)!
您如何获得订单1、2、3?
(即,如何确保第二个dataTask的httpBody可以填充来自第一个dataTask的结果?)
这是我的代码:(由于URL已被删除,因此无法执行-但您明白了)!
import UIKit
class ViewController: UIViewController {
let serialQueue = DispatchQueue(label: "myResourceQueue")
var stationID: Int = 0
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.serialQueue.sync {
let myResourceURL = URL(string: "myQueryString1")
let task = URLSession.shared.dataTask(with: myResourceURL!) { (data, response, error) in
if (error != nil) {
// print(error.debugDescription)
} else {
if …
Run Code Online (Sandbox Code Playgroud) synchronization grand-central-dispatch nsurlsessiondatatask urlsession
我试图使用NSOperation和NSOperationQueue从某些服务器下载多个图像.我的主要问题是下面的代码片段和这个链接http://www.dribin.org/dave/blog/archives/2009/05/05/concurrent_operations/之间的区别是什么?我更喜欢第二种解决方案,因为我们对操作有更多的控制,它更清洁,如果连接失败,你可以正确处理它.
如果我尝试使用下面的代码从服务器下载大约300张图片,我的应用程序将有一个相当大的延迟,如果我启动应用程序,并立即进入主屏幕,然后回到应用程序,我会崩溃,因为没有足够的时间让应用再次变得活跃.如果我取消注释[queue setMaxConcurrentOperationCount:1],则用户界面是响应的,如果它进入后台并返回到前台,它将不会崩溃.
但是如果我实现类似于上面链接的东西,我不需要担心设置maxConcurrentOperationCount,默认值很好.一切都是响应,没有崩溃,似乎所有队列都得到了更快的完成.
所以这让我想到第二个问题,为什么[queue setMaxConcurrentOperationCount:1]在我的代码中有如此大的影响?从文档中,我认为将maxConcurrentOperationCount保留为其默认值是正常的,这只是告诉队列根据某些因素决定最佳值应该是什么.
这是我在Stack Overflow上的第一篇文章,所以希望这是有道理的,感谢您的帮助!
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//[queue setMaxConcurrentOperationCount:1];
for(NSURL *URL in URLArray) {
[queue addOperationWithBlock:^{
NSHTTPURLResponse *response = nil;
NSError *error = nil;
NSData * data = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:URL] returningResponse:&response error:&error];
if(!error && data) {
[data writeToFile:path atomically:YES];
}
}];
}
Run Code Online (Sandbox Code Playgroud) 我将多个任务按顺序添加到NSURLSession(后台模式)中。我保持HTTPMaximumConnectionsPerHost =1。但是,我看到上传是按照随机顺序进行的,即,在第一个项目可能是第5个项目被拾取之后,第3个项目等等,等等-上载没有按顺序进行我提供给NSURLSession。有没有一种方法可以完全按照上传的顺序订购上传内容?