相关疑难解决方法(0)

NSOperation vs Grand Central Dispatch

我正在学习iOS的并发编程.到目前为止,我已经读过NSOperation/NSOperationQueueGCD.使用NSOperationQueueover 的原因是什么GCD,反之亦然?

听起来像是两者,GCD并从用户那里NSOperationQueue抽象出明确的创造NSThreads.然而这两种方法之间的关系对我来说并不清楚,所以任何反馈都要赞赏!

concurrency nsoperation nsoperationqueue grand-central-dispatch ios

454
推荐指数
7
解决办法
11万
查看次数

用NSURLSession替换NSURLConnection

我一直在设计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类将成为任何网络请求的单一联系点.

ios nsurlsession

9
推荐指数
1
解决办法
6825
查看次数

如何同步URLSession任务的串行队列?

使用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

5
推荐指数
1
解决办法
3565
查看次数

NSOperation和NSURLConnection神秘化了

我试图使用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)

iphone nsurlconnection nsoperation nsoperationqueue ios

2
推荐指数
1
解决办法
1509
查看次数

NSURLSession任务执行顺序

我将多个任务按顺序添加到NSURLSession(后台模式)中。我保持HTTPMaximumConnectionsPerHost =1。但是,我看到上传是按照随机顺序进行的,即,在第一个项目可能是第5个项目被拾取之后,第3个项目等等,等等-上载没有按顺序进行我提供给NSURLSession。有没有一种方法可以完全按照上传的顺序订购上传内容?

iphone ios nsurlsession nsurlsessionuploadtask

2
推荐指数
1
解决办法
1445
查看次数