异步数据连接 iOS

2024-01-10

我已经为我当前正在开发的应用程序编写了一个同步类。

由于数据量很大,它首先获取数据计数,然后批量下载NSOperationQueue。这一切都运行良好,我的同步算法运行得很快。

其工作方式如下...

- (void)synchroniseWithCompletionHandler://block for completion handler
                            errorHandler://block for error handler
{
    [self.queue addOperationWithBlock
     ^{
           //Create an NSURLRequest for the first batch
           //Send the request synchronously
           //Process the result
           //If error then cancel all operations in the queue, run errorHandler and return.
      }];

    [self.queue addOperationWithBlock
     ^{
           //Create an NSURLRequest for the second batch
           //Send the request synchronously
           //Process the result
           //If error then cancel all operations in the queue, run errorHandler and return.
      }];

    //Add all the remaining batches.

    [self.queue addOperationWithBlock
     ^{
           completionHandler();
      }];
}

这样可以将内存使用量保持在最低限度,并将速度提高到最高。这个想法是下载和处理都在同一个块中,并且在继续队列中的下一个操作之前都进行处理。

除此之外,我们现在已经在服务器上实现了 OAuth2 来对调用进行身份验证。

我通过 NXOAuth2 库设置 NXOAuth2Request 来完成这项工作。然后设置帐户并拉出签名的 URL 请求。然后我像以前一样使用这个 NSURLRequest 。

这样做的问题是,如果 OAuth 令牌在同步中途过期,则同步会失败。

NXOAuth2 库有一个功能...

+ (void)performMethod:(NSString *)aMethod
           onResource:(NSURL *)aResource
      usingParameters:(NSDictionary *)someParameters
          withAccount:(NXOAuth2Account *)anAccount
  sendProgressHandler:(NXOAuth2ConnectionSendingProgressHandler)progressHandler
      responseHandler:(NXOAuth2ConnectionResponseHandler)responseHandler;

这通过在执行令牌刷新后重新发送请求来处理令牌过期的情况。

然而,这个函数是异步的,所以我不确定如何最好地将它适合我的同步程序。

我可以使用它添加操作,然后将处理放入完成块中。但这样做意味着所有下载几乎都会同时运行,然后无法保证下载的处理顺序(由于数据依赖性,我需要以严格的顺序处理它们。

我现在能想到的唯一方法是将它们全部菊花链在一起......

[NXOAuth2Request performFirstRequest...
    {
        deal with the data.
        [NXOauth2Request performSecondRequest...
            {
                deal with the data.
                [NXOauth2Request performThirdRequest...
                    {
                        deal with the data.
                        finish
                     }];
             }];
      }];

这太混乱了,而且可能会变得非常混乱。

我还有其他方法可以处理这个问题吗?我唯一能想到的就是尝试让自己恢复活力。


虽然我喜欢块,但有些任务最好使用并发 NSOperations 来完成。我放了一个非常简单非常容易采用的项目 https://github.com/dhoerl/NSOperation-WebFetches-MadeEasy在 github 上,使用与我在商店中的应用程序中使用的完全相同的文件来获取和处理数据。您可以轻松地将相同的策略应用于您的任务。

  • 您从执行网络获取、获取一些数据的基本并发操作开始。
  • 使用子类,您可以以不同的方式处理该数据
  • 由于它是并发的,这意味着它有自己的运行循环,因此它可以阻止等待消息,以便您可以将授权合并到其中
  • 您可以使用任何您想要的逻辑 - 如果您在中间遇到授权失败,您可以取消您的 url 请求,授权,然后在一个操作中执行另一操作
  • 您可以连锁操作,这样一次就不会超过一个活动

我将这种结构用于所有 Web 交互,并且有大约 30 个子类对接收到的数据进行不同类型的处理。

该项目分为三个主要类别:

  • Operations Runner - 一个非常小的类,为 NSOperationQueue 提供高级接口

  • 并发操作 - 最低限度

  • WebFetcher - 一个运行 NSURLConnection 并在运行时完成的类

其他子类只需要提供一个“完整”的方法来处理数据。

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

异步数据连接 iOS 的相关文章

  • 用于将用户发送至设备应用商店上的应用评论页面的 URL

    为了将 iTunes App Store 置于最前面并打开它以显示应用程序的评论页面 要启动的 URL 是什么 我想将我的用户发送到 撰写评论 页面 其他一些 SO 答案提供了如下 URL 但它似乎不起作用 itms apps itunes
  • 点击后退按钮时,iCarousel 会显示在上一页

    当我按下后退按钮时 这iCarousel仍然显示 1 秒 为什么会发生这种情况以及如何阻止这种情况 我已经使用故事板创建了 iCarosel 视图 void viewDidUnload super viewDidUnload self ca
  • Android 和 IOS 是否可以在后台发送短信?

    我想制作一个应用程序 其主要功能取决于发送短信 在我开发 android native 之前 但现在我使用 React Native 来为 IOS 和 Android 制作它 在 Android 中 如果获得用户许可 可以在后台发送短信 但
  • UIButton 触摸事件落入底层视图

    我创建了一个小UIView其中包含两个UIButton是 视图响应UITapGesture事件 按钮应该响应TouchUpInside 但是当我点击按钮时 响应者是底层视图 并且点击手势选择器被触发 寻找意见或建议 您可以修改橙色视图中响应
  • RestKit链接器错误

    我一直遵循 RestKit 安装说明 但现在在尝试构建应用程序时出现错误 这是针对 ios iPad 的 我收到 命令 Developer Platforms iPhoneSimulator platform Developer usr b
  • 如果部署目标 < 基础 sdk,如何检查是否使用了不可用的方法?

    我想知道当部署目标低于基础 SDK 时 您如何检查代码是否不调用不可用的方法 可以在 SDK 等于部署目标的设备上运行应用程序 但我搜索一种更 自动 的方式 任何想法 问候 昆汀 最简单的方法是使用 IPHONE OS VERSION MA
  • AVAudioRecorder 标准化音量

    我有一个可以录制音频的应用程序 我想知道如何才能增加增益 有没有办法标准化音频或以某种方式放大它 谢谢 豪伊 看来我找到了解决方案 根据文档 AVAudioPlayer 音量可以在 0 0 到 1 0 之间 显然它可以设置为大于1 0的值
  • 我如何知道我的 iOS 应用程序的蜂窝网络访问是否被禁用?

    我有一个 iOS 应用程序 它在应用程序启动时发出一些小型网络请求 资源更新等 如果用户在 iOS 设置中关闭应用程序的蜂窝网络访问 他们每次启动时都会收到 iOS 的有关网络使用情况的提示 有没有办法以编程方式知道此应用程序的蜂窝数据已被
  • 为什么使用自动布局时视图的框架宽度始终为 600 x 600

    我正在制作一个基本的扫雷应用程序 用于快速练习 娱乐 我想让板的尺寸 10 个图块宽 适应任何 iOS 屏幕 为此 我通过获取tileContainer view frame width和 10来设置每个图块的大小 我的问题是 tileCo
  • UIButton 上的圆形渐变边框

    您好 我一直在尝试在我的应用程序中实现一个 UIButton 它具有圆角和渐变边框 我使用以下代码在按钮上创建渐变边框 let gradient CAGradientLayer gradient frame CGRect origin CG
  • 使用 facebook connect for iPhone 上传照片的记录流程

    看完之后 我确实在 Facebook 论坛上看到了这篇文章 link http forum developers facebook com viewtopic php id 30467 他们正在向 facebook 对象提供 UIImage
  • 从核心数据存储创建 .sqlite 文件?

    我在书籍和提供 sqlite 文件下载的网站上看到过教程 sqlite 文件用于核心数据 如何获取 sqlite 文件FROM应用程序或核心数据存储TO我的桌面 如果您要创建一个预填充的 sqlite 文件以与 Core Data 一起使用
  • iOS模拟器找不到SDK,可能需要重新安装SDK

    在这里 我遇到了另一个问题 今天正在开发一个 iOS 应用程序 当我运行 iPhone 5 0 模拟器的应用程序时 仅在该模拟器上遇到了一些奇怪的问题 当我尝试一次又一次地运行该模拟器时 我的 MacBook 屏幕上出现了两个弹出警报窗口
  • 使用 Xcode 6 和(可能)cocoapods 生成错误

    在构建使用 cocoapods 和最新 Xcode 6 GM 版本的 iOS 项目时 我收到以下静态分析器错误 error error reading pic error no analyzer checkers are associate
  • 如何使用自定义布局跳转到 UICollectionView 中的任何 Cell?

    我的水平 UICollectionView 中有 40 个单元格和一个按钮 当我点击按钮时 我可以从 5 号单元格跳转到 10 号单元格 但是一旦我想要转到另一个单元格 例如从 5 到 25 它不起作用 而是变为 0 code func s
  • 您如何评论 RFC?

    我有一些关于OAuth RFC 草案 https datatracker ietf org doc html draft hammer oauth 10 特别是关于它包含的一些错误 但我不确定可接受的制作方法是什么 底部有一个电子邮件地址
  • 如何将图像放在 UIButton 中文本的右侧?

    如果可以避免的话 我不想使用子视图 我想要一个UIButton其中包含背景图像 文本和图像 现在 当我这样做时 图像位于文本的左侧 背景图像 文本和图像都有不同的高亮状态 最简单的解决方案 iOS 10 及更高版本 Swift button
  • 如何区分iphone4和iphone 3

    我正在尝试使用 cocos2d 引擎为 iphone 构建游戏 我想知道如何区分用户使用的是 iphone 4 还是 iphone 3 因为我想为 iphone4 加载高分辨率图形 为 iphone 3 加载低分辨率图形 我知道我是否在以下
  • 如何获取 ios 日期数组中的所有星期日

    我只想要一个数组 它以 NSDate 的形式包含一年中的所有星期一 但速度很快 我在 Objective c 中使用以下代码 但不知道如何在 swift 中使用它 NSDate pickerDate NSDate date NSLog pi
  • cocos2d 2.0-rc2:结束director并重新启动

    我有一款由 cocos2d 驱动的游戏 它使用 UIKit 菜单 所以我只使用一个视图控制器的框架 即游戏本身 而且 它只有一个场景 从cocos2d 2 0开始 director本身就是一个UIViewController子类 所以我只是

随机推荐

  • 加载 XGBoost 模型:ModuleNotFoundError:没有名为“sklearn.preprocessing._label”的模块

    我在使用以下代码加载预训练的 xgboost 模型时遇到问题 xgb model pickle load open churnfinalunscaled pickle dat rb 当我这样做时 我收到以下错误 ModuleNotFound
  • 聊天中的 Python 客户端

    我在尝试构建聊天客户端时遇到问题 我刚刚开始 这是我的代码 import socket my socket socket socket socket AF INET socket SOCK STREAM my socket connect
  • NetLogo 高效创建任意度数分布的网络

    这是一个后续问题NetLogo 创建固定数量链接的有效方法 https stackoverflow com questions 32967388 netlogo efficient way to create fixed number of
  • 优化 Swift 中的嵌套 for 循环

    我得到了这个方法来计算白色像素UIImage 我需要遍历所有像素来增加我找到的每个白色像素的计数器 我正在尝试提高它的性能 但我找不到更好的方法 有任何想法吗 func whitePixelCount gt Int let width In
  • Lambda 表达式常用语法

    我可以遵循任何简单的语法或规则来在 C 中构建 lambda 表达式 吗 我阅读了一些文章并了解了 lambda 表达式是什么 但如果我有通用语法或规则 那将会有所帮助 有多种表达 lambda 的方法 具体取决于具体场景 一些示例 sim
  • Magento - JavaScript 错误阻止添加和保存类别

    我正在尝试在 Magento CE 1 8 1 的本地安装上添加新的根类别 但是当我按下 保存类别 按钮时 我在控制台中收到以下错误 并且屏幕上没有任何反应 我尝试重新安装所有核心文件等 但似乎没有任何方法可以解决此问题 Uncaught
  • Gdata包perl问题

    我正在尝试遵循这个简单的 2 分钟视频教程 将 Excel 电子表格作为数据框导入到 R 中 http www screenr com QiN8 http www screenr com QiN8 我遵循了每个步骤 包括在我的 Win 7
  • 通过 HttpClientFactory 实现实现动态代理

    I have Asp Net Core WebApi 我正在根据以下方式发出 Http 请求HttpClientFactory模式 https learn microsoft com en us aspnet core fundamenta
  • 浅层渲染依赖于 TweenLite 的组件

    我正在尝试使用 React 组件进行简单的单元测试 但我不断收到 C work portfolio node modules gsap TweenMax js 13 import TweenLite TweenPlugin Ease Pow
  • 如何在javascript文件之间共享数据?

    我 我认为 有 js 的独特问题 我正在使用量角器和 Jasmine 编写测试 我需要在 js 文件之间共享数据 有什么办法可以做到这一点吗 我找到的所有解决方案都是针对网页的 我只使用 js 文件 我期待您的迅速回复 如果有任何信息缺失
  • 使用 HttpClient 写入正文请求

    我想用 XML 内容类型编写请求正文 但我不知道如何使用 HttpClient 对象 http hc apache org httpclient 3 x apidocs index html http hc apache org httpc
  • 联合身份验证令牌保存在哪里 [WIF STS]?

    当我开始探索 WIF 时 我对以下几点有疑问 在Windows Identity Foundation WIF 中 查看安全令牌服务 STS 我想知道在哪里联合身份验证令牌正在被拯救吗 我认为它在浏览器 cookie 中 如果是的话 有人可
  • 如何在 Debian Wheezy 上安装 git 1.8 或更高版本

    我正在尝试安装更高版本的 git 主要是 1 8 或更高版本 如果我尝试使用安装它apt get install git我最终安装版本1 7 10 4 我已经尝试使用以下方法更改存储库 add apt repository ppa git
  • session._get_current_object() 到底返回什么对象?

    我正在使用 Flask 努力了解会话如何工作的细节 我正在使用 Python 3 6 1 烧瓶0 12 2 烧瓶文档明确指出 http flask pocoo org docs 0 12 api flask session 粗体是我的 会话
  • 按列逐行匹配两个文件 - 无键

    我有两个包含 80 000 多条长度相同的记录的大文件 我需要按文件的前 8 个字符逐行比较两个文件 文件一的第一行将与文件二的第一行进行比较 文件一的第二行将与文件二的第二行进行比较 样本文件1 01234567blah blah1 11
  • 如何修复此错误:构建 FutureBuilder 时抛出以下断言(脏,状态:_FutureBuilderState#89711):

    这是错误 有问题的小部件是 FutureBuilder 构建函数绝不能返回 null 要返回导致建筑小部件填充可用空间的空白空间 请返回 Container 要返回占用尽可能少空间的空白空间 请返回 Container width 0 0
  • 将信息从 java 传递到 c++ 的最佳方式是什么?

    我有一个 java 应用程序 我需要将一些信息传递给 C 程序 有人建议我使用一些简单的套接字编程来做到这一点 这是最好的方法吗 如果不是 还有什么替代方案 如果是这样 我应该如何学习套接字编程 您有几个选择 将文件从 Java 传递到 C
  • 如何调试 move_uploaded_file 的问题?

    我有一个像这样的表格
  • 通过 wifi 传输 ipad 到 ipad 文件

    通过 wifi 将文件从一台 ipad 传输到另一台 ipad 的最佳方法是什么 我知道如何处理 wifi 网络连接 但我需要知道将图像 视频等从一台 ipad 传输到另一台 ipad 的最有效方法 您可能想看看https github c
  • 异步数据连接 iOS

    我已经为我当前正在开发的应用程序编写了一个同步类 由于数据量很大 它首先获取数据计数 然后批量下载NSOperationQueue 这一切都运行良好 我的同步算法运行得很快 其工作方式如下 void synchroniseWithCompl