用 NSURLSession 替换 NSURLConnection

2023-11-26

我已经开始设计NetworkCommunication。我有一个设计NSOperation子类创建并管理自己的NSURLConnection. The NSOperation子类由一个实例化NetworkManger类将其添加到NSOperationQueue。请求完成后,委托人(例如:ViewController将被调用)。这是流程:

网络管理器实例化NSOperation子类(封装 URL、参数等)并将其添加到NSOperationQueue它坚持认为。 NSOperation子类实例化NSURLConnection(它执行asynchronous请求并检索数据)NSURLConnection将数据转储到 NSOperation 子类 NSOperation 子类执行委托(视图控制器)提供的完成块。 我正在尝试使用相同的模式来实现NSURLSession现在。我希望能够将发出网络请求所需的 url 和参数封装在单个对象内。

如果我使用相同的模式可以吗?NSURLSession。我检查了AFNetworking类。但是,他们没有将 NSOperation 子类化NSURLSession。而且,会话对象应该去哪里。它是 NSOperation 类的一部分吗?

有人可以就此提供一些专家建议吗?我应该能够取消请求、上传(POST/PUT)、下载数据。网络管理器类将是任何网络请求的单一联系点。


Update:

NSURLConnection在 Mac OS 10.11 和 iOS 9 中已弃用。因此,此时NSURLSession应该用来代替NSURLConnection。作为NSURLConnection.h标题说:

已弃用: The NSURLConnection不应再使用类。NSURLSession是替代品NSURLConnection.

我原来的答案如下。


答案取决于您是否需要各种丰富的内容NSURLSession是否委托方法。如果您可以使用完成块再现(即没有进度回调,没有流等),则从NSURLConnection to NSURLSession是相当微不足道的。只要把你的NSURLSession实例在你的NetworkManager类,然后包装基于委托NSURLSessionTask并发中的实例NSOperation子类,你就完成了。只需采用标准的异步/并发NSOperation子类模式。

如果您使用的是基于委托的再现NSURLSession,这是完全不同的一锅鱼。主要的麻烦是各种NSURLSessionTask在会话上调用委托方法delegate而不是任务委托对象。乍一看,这可能听起来像是一个微不足道的问题,但是例如,如果您的操作实例具有唯一的完成/进度块,那么您就会陷入如何让会话对象将这些委托方法回调映射到各个实例的麻烦。原始请求操作实例。

为了解决这个问题,您必须维护任务标识符到您的任务标识符的映射。NSOperation子类对象。然后你就可以实现这些NSURLSessionTask(包括任务、下载任务、上传任务)各自的委托方法NSOperation子类。这NSURLSession然后,当网络管理器类收到一个NSURLSessionTask委托调用,使用任务标识符来识别适当的NSOperation实例,然后在那里调用适当的委托方法。

最后,如果你打算处理背景NSURLSession在这种情况下,生活会变得更加困难(因为即使您的应用程序终止并且其所有对象都已被丢弃,后台任务仍将继续)。后台会话根本不适合NSOperation基于的方法。

最重要的是,如果您只需要完成块,那么这是微不足道的NSURLSession方法,但如果您需要基于委托的再现,那就有点麻烦了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用 NSURLSession 替换 NSURLConnection 的相关文章

  • 带约束的嵌套集合视图的意外行为 (Swift 4)

    我的表格视图中有一个单元格 其中包含水平分页集合视图 该集合视图的每个页面内都有一个垂直集合视图 为了避免 滚动滚动 问题 我在垂直集合视图中禁用了垂直滚动 垂直集合视图的单元格计数不是静态的 可以是任意数字 因此 这会产生一个问题 集合视
  • NSURLCache 不缓存

    我正在使用 Xcode 6 1 6A1030 iOS7 和 iOS8 模拟器 NSURLCache 似乎没有缓存任何东西 我使用 Cache Control 标头 我的服务器返回带有 max age 6000 的 Cache Control
  • iOS 如何触发视频退出全屏后继续播放?

    我正在构建一个在 iOS 中播放视频的网站 我有一个在 iOS 中工作的全屏按钮 但是退出全屏时视频会暂停 有谁知道一种方法可以强制视频在退出全屏时继续播放 或者如何设置一个侦听器来触发视频在退出全屏时自动播放 这是我的代码
  • 在 Swift 中以编程方式为 iOS 制作带有名字首字母的图像,例如 Gmail

    我需要在 UITableView 中显示与其姓名相对应的每个用户的个人资料图片 在下载图像之前 我需要显示一张带有他名字的第一个字母的图像 就像在 GMail 应用程序中一样 如何在 Swift for iOS 中以编程方式执行此操作 不需
  • UILabel 中的文本未垂直居中

    我使用以下代码创建了一个标签 func setupValueLabel valueLabel numberOfLines 1 valueLabel font UIFont name Avenir Black size 50 valueLab
  • removeItemAtPath 完成

    我正在以这种方式删除路径上的文件 UIPanGestureRecognizer gesture UIPanGestureRecognizer sender UIButton button UIButton gesture view UIPa
  • 开发者可以在 Windows 应用程序中使用 iCloud 吗?

    开发人员可以使用 Apple 的 iCloud API 在 Mac OS X 和 iOS 上的不同版本的应用程序之间同步应用程序数据 如果开发人员拥有 Windows 版本的应用程序 该版本是否也可以使用 iCloud 将应用程序数据与 M
  • 从 IOS 应用程序注销的完美方法是什么?

    下面的代码可以工作 但有一个错误 场景是 我首先登录进入应用程序系统 登录成功后 应用程序将设置 UserDefaults UserId 之后 我可以使用存储的 UserId 导航应用程序视图 一旦我进入设置和选项卡注销 这将清除 User
  • 使 iOS 应用程序与 iPhone 6 和 iPhone 6 尺寸兼容 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我创建了一个应用程序 其中使用 xib 进行布局 目前我使用两种不同的 xib 一种用于iPhone4 320 480 一种用于iPh
  • 启动深色或浅色模式的图像

    如何为深色模式和浅色模式选 择一组不同的启动图像 我有一个 LaunchImages 集 当应用程序启动时 会显示一个图像 对于浅色模式 这似乎不错 但是如果我尝试在设置为深色模式 iOS 13 的设备上打开我的应用程序 则该图像看起来很糟
  • 重叠的装载机圆

    我试图重现苹果为应用程序 活动 制作的重叠圆圈 见下图 如果您使用标准贝塞尔路径 起始 结束位置将仅在 0 到 2PI 之间产生影响 例如 如果您尝试填充 4PI 即使使用一些阴影 则无法模拟重叠加载 如何制作类似于苹果解决方案的东西来创建
  • 我们能否检测用户是否通过主页按钮或锁定按钮离开而没有监听 darwin 通知?

    我最近向应用程序商店提交了一个新的二进制文件并将其发送以供审核 但它立即被拒绝并显示以下消息 不支持的操作 不允许应用程序监听设备锁定通知 经过一番挖掘后 我发现我们无法使用 com apple springboard lockstate
  • 将自定义图像设置为 UIBarButtonItem 但它不显示任何图像

    我想将自定义图像设置为 UIBarButtonItem 但它只显示周围的矩形框并且不显示实际图像 func setupBrowserToolbar let browser UIToolbar frame CGRect x 0 y 20 wi
  • iOS UITableViewCell cell.imageView 设置圆角

    嘿我正在尝试设置cell imageView s cornerRadius 但似乎不起作用 cell imageView layer cornerRadius 9 它会起作用还是我应该添加自定义UIImageView在我的牢房里有圆角吗 我
  • 以弯曲格式显示文本

    我正在寻找以曲线格式绘制一些文本 我使用哪个控件并不重要 UITextField UILabel or UITextView 我只想显示如图所示的文本 仍在寻找解决方案 请帮忙 查看此链接 https nodeload github com
  • 不明白 Swift 中的闭包示例

    我正在尝试了解 swift 和闭包 我被这个例子困住了 numbers map number Int gt Int in let result 3 number return result 什么是 number Int gt Int 它是一
  • AWS S3 公共对象与私有对象?

    回到 S3 我的存储桶中有图像的 URL 我将在我的应用程序中呈现这些图像 但它们被设置为私有 当我尝试单击该链接时 它显示 访问被拒绝 当我将链接的设置更改为公共时 它会通过 但是我读到公共访问并不是最安全的事情 所以这本质上是一个由两部
  • 将 UIButton 中的图像缩放到 AspectFit?

    我想将图像添加到 UIButton 并且还想缩放图像以适合 UIButton 使图像变小 请告诉我该怎么做 这是我尝试过的 但它不起作用 将图像添加到按钮并使用setContentMode self itemImageButton setI
  • ios - Gamekit 的 GKOctree 未找到元素

    我正在尝试使用GKOctree https developer apple com documentation gameplaykit gkoctree用于高效检索 3D 空间中的对象 然而 以下代码似乎没有按预期工作 import Gam
  • 在 HTML5 iOS 7 / iOS 8 中显示十进制键盘

    经过几个小时的搜索后 我只是有一个简单的问题 是否有可能在网络浏览器输入字段中显示小数键盘 input type number 只显示数字 但我需要在左下角使用逗号或点 我尝试过任何事情 pattern step等等 但没有显示十进制键盘

随机推荐

  • 避免将文本转换为链接即内容可编辑模式

    在 contenteditable div 中 在 IE 文本中 如 http blablabla www blablabla bla blabla 等自动转换为超链接http blablabla 布拉布拉布拉 bla blabla 我怎样
  • ionic 中自动增长文本区域

    我正在尝试向我的应用程序添加自动增长的文本区域 但由于某种原因它不起作用 我正在使用的模块是https github com tagged autogrow 在ionic论坛上推荐的 上面的答案并没有缩小 这是一个改进的版本 https c
  • 如何在 SQL Server Management Studio 上启用自动事务范围?

    我习惯于使用类似的工具Toad or PL Sql 开发人员对于 Oracle 我在查询窗口上运行的每个 SQL 语句都会在事务范围下自动运行 因此 如果我的 SQL 语句不正确 或者即使我错过了 SQL 脚本中的某些内容 我也只能通过单击
  • 如何通过单击模式窗口外部来关闭模式?

    在一个非常简单的 jQuery 模式中 我通过单击 CLOSE 来关闭模式 close click function e e preventDefault overlay alertModalOuter fadeOut 400 functi
  • 如何在ZF2中渲染具有布局的邮件模板?

    在 ZF1 中 我使用以下代码来呈现邮件正文 View erstellen view new Zend View Layout erstellen layout new Zend Layout HelperPath muss hier no
  • 用户输入+Ruby+正则表达式?

    我想为用户提供一个可以输入文本的文本区域 稍后我会将该输入与不同的输入进行匹配 如果匹配则将其提取 Flow 用户在文本区域中输入带回车的文本 文本保存在数据库的文本字段中 然后我使用以下内容来提取 text reply text repl
  • Python:这两个导入语句有什么区别?

    它们在功能上对我来说看起来都是一样的 使用其中一种与另一种相比有什么区别和优势吗 gt gt gt from datetime import datetime timedelta gt gt gt from datetime import
  • 从 com.apple.main-thread 入队(线程 1)崩溃 | iOS |斯威夫特 4.1

    上面发生了什么 从接收到的用户数据数组初始化领域模型 在后台线程中将所有模型一次性写入领域数据库中 如果领域模型已经存在 则通过创建副本进行更新 任何人都可以在这里指导我关于我做错了什么 我遇到了类似的问题 在这里 您可能正在从不同的线程访
  • 编译器对 PerformSelectorOnMainThread:@selector(delegateMethod) 发出警告

    我有一个包含一些 Web 服务功能的 NSOperation NSOperation 有一个委托 当操作结束时将向该委托发送消息 由于 NSOperation 位于不同的线程上 我必须像这样进行调用 delegate performSele
  • git:具有提交限制的累积差异

    git log有一些非常有用的提交限制选项 例如 no merges and first parent 我希望能够在为一系列提交生成累积差异补丁 stat numstat 时使用这些选项 使用这些命令 git log oneline fir
  • 为什么 const 限定变量被接受为 gcc 的初始值设定项?

    在最新版本的 gcc 或 clang 中编译此代码时 std c17 pedantic errors Wall Wextra static const int y 1 static int x y 然后我没有收到编译器诊断消息 即使我相当确
  • 如何用Java计算某人的年龄?

    我想在 Java 方法中以 int 形式返回以年为单位的年龄 我现在所拥有的是以下内容 其中 getBirthDate 返回一个 Date 对象 带有出生日期 public int getAge long ageInMillis new D
  • 如何等待elasticsearch重新索引?

    我有一个ElasticSearch带索引posts设置好的了 我会时不时地向其推送新文档 I want ElasticSearch仅当所有文档均已编制索引时才回复我的查询 我怎样才能做到这一点 在 ES 2 中 您可以调用refresh A
  • SQLITE:如果共享列,则将行合并为单行

    从上一篇文章中 我在 sqlite3 中有以下视图 CREATE View AttendeeTableView AS SELECT LastName FirstName as AttendeeName CompanyName PhotoUR
  • 编译器对虚函数调用的优化

    说明为什么虚拟分派在运行时发生的最流行的例子是当无法在编译时确定将创建哪个派生类时 例如 Base b rand 2 1 new Derived1 new Derived2 或者当它取决于用户输入时 假设情况并非如此 并且可以在编译时完全确
  • 如何使用实体框架查询外键对象?

    我正在尝试了解 Entity Framework 6 但遇到了一个问题 我已经能够在测试项目中重现该问题 A Movie has a Nameand a Revenue A Revenue has a GrossIncome public
  • “clear”是Javascript中的保留字吗?

    我只是花了很长时间才弄清楚我不应该使用clear 作为Javascript中函数的名称 Hello br
  • Winform另存为

    有谁知道任何文章或网站显示如何在 win 表单中创建 另存为 对话框 我有一个按钮 用户单击并序列化一些数据 然后用户使用此 另存为 框指定他们希望将其保存的位置 你的意思是像SaveFileDialog 来自MSDN示例 稍作修改 usi
  • C++ - 从文件读取到双精度[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我对编程还比较陌生 目前正在学习 C 课程 到目前为止我还没有遇到任何重大问题 我正在制作一个程序 其中 X 数量的评委可以打出 0 0 10 0 双倍 的分数 然后删除最高和最低的
  • 用 NSURLSession 替换 NSURLConnection

    我已经开始设计NetworkCommunication 我有一个设计NSOperation子类创建并管理自己的NSURLConnection The NSOperation子类由一个实例化NetworkManger类将其添加到NSOpera