如何重试基于块的 URL 请求

2024-07-04

我正在使用 iOS7 的新 URL 请求方法获取数据,如下所示:

NSMutableURLRequest *request = [NSMutableURLRequest
    requestWithURL:[NSURL URLWithString:[self.baseUrl 
    stringByAppendingString:path]]];

NSURLSessionDataTask *dataTask = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
    NSUInteger responseStatusCode = [httpResponse statusCode];

    if (responseStatusCode != 200) { 
        // RETRY (??????) 
    } else       
        completionBlock(results[@"result"][symbol]);
}];
[dataTask resume];

不幸的是,我有时会收到 HTTP 响应,表明服务器无法访问(response code != 200)并且需要向服务器重新发送相同的请求。

如何才能做到这一点?我需要如何完成我的评论上方的代码片段// RETRY is?

在我的示例中,我在成功获取后调用完成块。 但我怎样才能再次发送相同的请求呢?

谢谢你!


最好有一个重试计数器来防止你的方法永远运行:

- (void)someMethodWithRetryCounter:(int) retryCounter
{
    if (retryCounter == 0) {
        return;
    }
    retryCounter--;

    NSMutableURLRequest *request = [NSMutableURLRequest
                                    requestWithURL:[NSURL URLWithString:[self.baseUrl
                                                                         stringByAppendingString:path]]];

     __weak __typeof(self)weakSelf = self;

    NSURLSessionDataTask *dataTask = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
        NSUInteger responseStatusCode = [httpResponse statusCode];

        if (responseStatusCode != 200) {
            [weakSelf someMethodWithRetryCounter: retryCounter];
        } else
            completionBlock(results[@"result"][symbol]);
    }];
    [dataTask resume];
}

应该按以下方式调用:

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

如何重试基于块的 URL 请求 的相关文章

  • 我如何请求增加 iPad 上的 HTML5 本地存储大小,就像 FT 网络应用程序那样?

    如果你打开http app ft com http app ft com 金融时报移动网络应用程序 系统会提示您将该应用程序添加到您的 主页 执行此操作后 当您打开应用程序时 系统会再次提示您允许将 localstoreage 数据库大小增
  • 嵌入了 iOS 项目的 OSX 项目 - 找不到 UIKit.h [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个 OSX 项目和一个 iOS 子项目 子项目使用 UIKit h 但即使子项目已将 UIKit 框架添加到 链接二进制文件与库 部
  • 无法加载捆绑包“MyProjectUITests”,因为它已损坏或缺少必要的资源。尝试重新安装捆绑包

    我愿意向我的应用程序添加单元和 UI 测试 我首先成功配置了单元测试 我尝试对 UI 测试执行相同的操作 添加新的 UI 测试包目标后 这是我的 Podfile platform ios 8 0 use frameworks inhibit
  • 如何对字符串进行 URL 编码

    我有一个 URL 字符串 NSString 带有空格和 人物 如何对整个字符串 包括 符号和空格 很遗憾 stringByAddingPercentEscapesUsingEncoding并不总是 100 有效 它对非 URL 字符进行编码
  • 使用 NSURLConnection 进行单元测试

    我想测试一段使用网络的代码 NSURLConnection类 具体而言 代码 我们称之为NetworkManager 看起来有点像这样 id buildConnection some more code and then return NS
  • 实例化新视图控制器时从内存中删除视图控制器

    在我的应用程序中 我实例化新的视图控制器而不是使用 Segues 因为它在动画中看起来更好 因此我的视图继续在后台运行 这会导致大量内存泄漏 我返回主屏幕的代码是 let mainStoryboard UIStoryboard name M
  • Xcode 6 具有 Swift 超慢打字和自动完成功能

    是只有我还是 Xcode 6 6 0 1 with Swift 似乎是超级慢当您键入代码时 尤其是使用自动完成功能时 一个普通的 Objective C 类 即使在 Swift 项目中 工作原理也几乎和以前一样 所以是 Swift 杀死了它
  • AVAssetResourceLoaderDelegate 未被调用

    我一直在尝试在AVAssetResourceLoaderDelegate协议但它似乎从未被调用 我已经验证一切都发生在主线程上 从创建AVURLAsset 创建AVPlayerItem 创建委托 并将委托队列设置到主线程 我正在尝试流式传输
  • 提交到 AppStore:发现意外的 Mach-O 标头代码:0x72613c21

    我构建了一个 iOS 应用程序 我想将其提交给 Apple 以便让我的同事测试它 我首先清理了工作区 我使用的是 CocoaPods 然后将其存档 然后我进入 档案 窗口并单击 上传到 App Store 出现以下错误 发现意外的 Mach
  • 不要在 iOS 上显示蜂窝数据警告

    如果用户决定不允许应用程序在每次尝试打开应用程序时访问蜂窝数据 则会显示一条警告 告诉他们蜂窝数据已关闭 SDK中有没有办法停止显示此消息或控制其显示的时间 位置 如果您在权限被撤销的情况下尝试访问互联网 系统将显示此消息 为了防止它出现
  • iOS Swift:谷歌登录错误

    我正在关注this https developers google com identity sign in ios sign in ver swift before you begin使用 swift 在我的 iOS 应用程序中添加 go
  • “无法连接到 iTunes Store”

    昨晚 应用内购买没有在 iOS7 模拟器设备上显示 但今天我什至没有更改代码 我也开始在 iOS 8 设备上遇到相同的错误 这是我的课 class InAppC UITableViewController SKProductsRequest
  • 如何重试基于块的 URL 请求

    我正在使用 iOS7 的新 URL 请求方法获取数据 如下所示 NSMutableURLRequest request NSMutableURLRequest requestWithURL NSURL URLWithString self
  • 更改 NSSplitViewController 内的视图

    我正在尝试将我的 Objective C 和现在正在提高的 Swift 知识迁移到 Mac OS X 的应用程序 学习曲线陡峭 我正在尝试加载一个NSSplitViewController如果您愿意的话 根据 主视图 上按下的按钮 详细视图
  • 为什么 UIPickerView 是半透明的

    Why UIPickerView 100不是不透明的吗 当我将文本颜色设置为白色并将 UIPickerView 放在红色背景上时 UIPickerView 项目有一个红白色文字颜色 我尝试使用自定义视图viewForRow 但还是没有效果
  • UIScrollView 在 addSubview 或更改框架后出现不必要的滚动

    我有一个UIScrollView充满子视图 创建它并最初填充它时一切都很好 但是 当我添加位于可见屏幕部分之外的新子视图时 或者当我只是调整也在可见屏幕部分之外的现有子视图的大小时 会出现随后的 0 3 秒长的滚动动画 我可以看到它 发生在
  • 在 Xamarin.Forms 中添加方向更改布局

    我需要实现的是 在将屏幕从纵向更改为横向时向现有页面添加布局 我已经成功地使用检测方向变化void OnSizeAllocation 双倍宽度 双倍高度 但我无法为此事件添加布局 我的示例 C 代码是 public class MyLayo
  • iOS 7.1 CommonCrypto 库抱怨:隐式转换丢失整数精度:'NSUInteger'(无符号长整型)到 CC_LONG(无符号整型)

    我在从文件执行 MD5 时收到上述错误 标题中 我通常可以处理这些类型的 32 gt 64 位转换问题 但在这种情况下 我不知道我应该做什么 因为 CC MD5 是其中的一部分的CommonCrypto gt CommonDigest iO
  • 以编程方式 Swift 在 UIView 上添加 UITextField

    我是 Swift 和 iOS 编程新手 我试图创建一个UITextField以编程方式使用 Swift 但无法完全正确 另外 如何将其更改为半透明效果以淡入背景 var myField UITextField UITextField fra
  • 删除 iOS 中的后台位置警报?

    我正在编写一个跟踪用户位置的导航应用程序 为了继续显示有关路线的通知 当手机锁定 接听电话等时 我还需要在应用程序处于后台时继续跟踪位置 Capabilities gt Background Modes gt Location update

随机推荐