异步请求未进入完成块

2024-02-12

下面的代码是为了让我更好地理解[NSURLConnection sendAsynchronousRequest:queue:completionHandler].

NSLog中的陈述completionHandler块,但是当我运行它时main.m在命令行项目的 XCode 中,它永远不会进入completionHandler块。我尝试过使用不同的队列,mainQueue and currentQueue但两者都不起作用。

我的预感是队列在请求完成之前被释放并且涉及保留周期。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSCache *myCache = [[NSCache alloc] init];

        NSArray *images = @[
         @"https://i.stack.imgur.com/E66qr.png",
         @"http://www.tiempoyquimera.com/wp-content/uploads/2010/01/Euro-Trash-Girl-2010.jpg",
         @"http://1.bp.blogspot.com/-Mxd8AB2nbQY/UYCISJiQz3I/AAAAAAAAAH8/Tc43U8aa9dM/s1600/Tarantino10colhans_1460858i.jpg",
         @"https://awestruckwanderer.files.wordpress.com/2014/02/alan-watts.png",
         @"http://www.esalen.org/sites/default/files/photo_images/20120201_DELLIS__MG_9612_711.jpg"];

        for (NSString *image in images){
            NSURL *myURL = [NSURL URLWithString:image];
            NSURLRequest *request = [[NSURLRequest alloc] initWithURL:myURL];

            NSLog(@"Can handle request %@", @([NSURLConnection canHandleRequest:request]));
            NSOperationQueue *queue = [[NSOperationQueue alloc]init];

            [NSURLConnection sendAsynchronousRequest:request
                                               queue:[NSOperationQueue mainQueue]
                                   completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                                       NSLog(@"In the completion handler");
                                       if (!error)
                                       {
                                           // save data to cache with url as key
                                           NSLog(@"Image Added to Cache");
                                           [myCache setObject:data
                                                       forKey:myURL];
                                       } else
                                       {
                                           NSLog(@"Image Not Added to Cache");
                                       }
                                   }];
        }
    }
    return 0;
}

我的预感是队列在请求完成之前被释放并且涉及保留周期

不完全的。不涉及保留周期。这涉及到坚持。你正在做这件事main功能。它退出立即地- 异步的东西(网络和随后的回调)是异步的,所以稍后会出现,if我们还有什么坚持。但我们不这样做。main退出,这意味着整个该死的计划被拆毁,kaboom,在有机会进行任何联网之前,更不用说在联网之后回调完成处理程序了。

现在将其与现实生活中发生的事情进行对比。在真正的 iOS 应用程序中,main does not退出,因为它调用UIApplicationMain,循环直到应用程序终止。

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil,
            NSStringFromClass([AppDelegate class]));
    }
}

在该代码中,UIApplicationMain只是继续运行,直到中止或以其他方式终止。与此同时,类和实例已经生机勃勃,并且它们持续存在,因为UIApplicationMain不会停止。例如:

@implementation MyViewController
- (void) someMethod {
    // ...
    [NSURLConnection sendAsynchronousRequest:request
         queue:[NSOperationQueue mainQueue]
         completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
             // ...
    }
}
@end

现在,从某种意义上说,完全相同的事情发生了:someMethod立即退出。但我们的程序总体仍在运行!UIApplicationMain有一个运行循环,并且该运行循环仍在循环。因此,事情会继续下去,所以现在异步材料可以发生 - 我们可以联网,然后调用回调。

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

异步请求未进入完成块 的相关文章

  • Xcode 5:单元测试未运行

    我创建了一些测试用例 它们都通过了 那是因为它们没有被运行 从 Xcode 中 我得到 Test Suite All tests started at Test Suite All tests finished at Executed 0
  • 使用带有通配符的 jquery grep 搜索对象数组

    我正在使用 jquery grep 搜索对象数组 并希望在搜索中包含通配符 例如 我有一个数组如下 courses code ENCH3TH otherFields otherStuff code ENCH3THHS1 otherField
  • SwiftUI 从一个列表拖动到另一个列表

    我正在尝试在列表之间拖放 我尝试过的 我找到了一个在 UIKIt 中执行此操作并使用 UIViewControllerRepresentable 的解决方案 但这不是我想要的 另一个解决方案是在列表上使用 onDrag 但这在 iPad 上
  • RestKit:BOOL 值

    我有一个NS ENUM保存清单的状态 这两个属性是Pending and Completed typedef NS ENUM NSUInteger ChecklistStatus Pending Completed 我正在尝试获取状态并将其
  • iOS7:我们可以在 Dynamic Type 中使用 Helvetica Neue 以外的字体吗?

    我们正在为 iOS7 设计一个应用程序 我们的设计师想要使用非默认字体 Avenir 但我不想失去动态类型功能 据我了解 动态类型只能与默认系统字体 Helvetica Neue 一起使用 是否可以使用其他字体 或者目前无法选择 据我了解
  • 转换 [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA], (id)kCVPixelBufferPixelFormatTypeKey, nil];到斯威夫特

    这里出现错误 绞尽脑汁 尝试了各种组合 找不到类型 NSDictionary 的初始化程序 该初始化程序接受类型 object Int forKey CFString 的参数列表 configure the pixel format Obj
  • Google 地图 ios:Mapview 路线垂直折线始终指向位置箭头的北部或顶部

    我已经在我的应用程序中实现了 Google Maps IOS 的基本功能 我必须将地图视图的方位设置为始终指向顶部或北部 我需要 如果我点击导航按钮 地图视图应该动画到位置箭头顶部 就像谷歌地图 ios 应用程序一样 箭头应始终固定并指向北
  • SwiftUI 关闭多个模态表

    我在用 sheet isPresented self showModal 在我的根视图中呈现一个模式 在模态中 我正在使用NavigationView引导用户浏览各个页面 对于用户配置文件构建器 在导航堆栈的最后一页中 我正在使用 Envi
  • 如何加密捆绑的文本/json 文件?

    我的 iOS 应用程序捆绑了几个文件 现在 如果有人下载该应用程序并访问 ipa 文件 他就可以轻松阅读它们 我想让事情变得更难 您知道有关该主题的任何资源吗 我想我需要一个加密库 以及编码文件的构建脚本中的一些脚本 当然 我知道有人可能会
  • 我安排一个计时器使用 readRSSI 函数读取 RSSI,但是当我的应用程序进入后台时计时器停止

    我安排一个计时器使用 readRSSI 函数读取 RSSI 但是当我的应用程序进入后台时计时器停止 也许有一个好方法可以在应用程序进入后台时从外围设备的通知中获取 RSSI 值 但我不知道该怎么办 有人可以帮助我吗 有人有更好的方法吗 我也
  • 有没有办法直观地看到精灵套件的 SKPhysicsbody 边界线?

    我在用bodyWithPolygonFromPath定义物理体的体积 我使用http dazchong com spritekit http dazchong com spritekit 获取所需的路径 但路径似乎不正确 我希望查看物理体路
  • 如何通过GPUImage调整图像的亮度和对比度?

    我编写了一种使用亮度因子和对比度因子过滤图像的方法 如下所示 UIImage image UIImage image withBrightness float brightness contrast float contrast GPUIm
  • 无需递归即可展平多个嵌套数组的数组 - javascript

    也许这是一个愚蠢的问题 但我无法意识到是否可以在不使用递归的情况下展平多维数组 我用递归编写了一种解决方案 function transform arr var result arr forEach flatten function fla
  • Siri - 联系人搜索行为类似于 Skype 的音频通话

    我正在实现一个 VoIP 应用程序 我需要通过 Siri 发起呼叫 我能够通过 Siri 发起呼叫 但问题是 每次启动应用程序时 尽管联系人不在应用程序的联系人列表中 我不知道如何以及在哪里处理这个问题 我的意思是 如果应用程序没有像 Sk
  • 在 iOS 上保存(私人)应用程序设置?

    我知道NSUserDefaults用于保存 恢复user优先 什么是等效类应用 例如 应用程序可能有一个 上次运行 字段 或者它可能有一个用于在应用程序级别使用的设备的唯一标识的字段 我的目的是将应用程序的设置 而不是用户的设置 保留在设置
  • 无法识别的选择器发送到类

    我已经看到 这是一个常见问题 但我自己找不到任何解决方案 这是代码 class ButtonViewController UIViewController override func viewDidLoad super viewDidLoa
  • 删除数组中的重复元素[重复]

    这个问题在这里已经有答案了 可能的重复 在 JavaScript 数组中查找重复值的最简单方法 https stackoverflow com questions 840781 easiest way to find duplicate v
  • 同时运行 x 个网络请求

    我们公司有一个网络服务 我想通过我自己的服务发送 XML 文件 存储在我的驱动器上 HTTPWebRequestC 中的客户端 这已经有效了 Web服务同时支持5个同步请求 一旦服务器上的处理完成 我就会从Web服务获得响应 每个请求的处理
  • iOS Facebook SDK - 远程定义 FacebookAppID

    使用iOS Facebook SDK 3 0 需要在应用程序的info plist中定义FacebookAppID和相关的URL Scheme 我想远程定义这些 向我自己的服务器请求应用程序 ID 所以有两个不同的问题 我可以在运行时更改应
  • UICollectionview 单元格选择

    我制作了一个图像网格 为了显示其选择 我在选择时为图像绘制了边框 但问题是 当我选择顶部的一些图像并向下滚动图像网格时 底部的其他一些图像似乎也被选择了 下面是我的代码片段 UINib cellNib UINib nibWithNibNam

随机推荐

  • iOS - 如何访问设备的文件库?

    我正在尝试构建一个可以打开设备上存储的任何 pdf 的应用程序 但我真的不知道如何获取这些文件的句柄 我搜索了文档 发现的每个类都假设我已经拥有该文件的句柄 我在这里一定缺少一些东西 有多种应用程序可以访问音频和图片文件 肯定有办法访问 p
  • 如何使用VBA从Excel工作表中的图片获取EXIF信息

    如何使用 VBA 从 Excel 工作表中的形状图片获取 EXIF 信息 如纬度 经度等 是否可以在不从工作表或压缩的 Excel 工作簿中提取或复制图片的情况下获得它 我可以使用以下代码迭代压缩文件夹内容 Public Sub ReadZ
  • 如何在 Blazor Server 中动态添加、删除输入文本框并获取值?

    我有 Blazor 服务器应用程序 如何在单击按钮时动态添加新的输入文本框并将其删除 并在单击提交按钮时获取所有输入文本框的值 以便将它们保存在数据库中 for int i count i gt 1 i div class row div
  • 在 Spring Boot 中使用@Profile

    我有 Spring Boot 应用程序 1 1 5 发布 并通过配置属性启用我的配置文件spring profiles active MyProfile 配置文件被正确激活 我可以通过正在创建的配置文件中的 bean 看到这一点 然后我有一
  • 从键盘获取输入,无需等待输入

    fgets 和 getch 等函数将等待用户输入 然后再继续 我想要的是这个功能 如果用户按 x 变量将开始递减 c 将使变量开始递增 问题是当我尝试获取输入时程序停止 我希望变量在等待用户输入时继续递增或递减并且不 冻结 我正在使用 Vi
  • 将密码重置添加到 Django Admin 会转到错误的 URL?

    我正在关注以下部分添加密码重置功能 https docs djangoproject com en 2 1 ref contrib admin adding a password reset feature到 Django Admin 它会
  • 为什么不从 WinRT 应用程序(在 StreamSocket 上)连接到 win32 应用程序(在 QTcpSocket 上)

    我正在开发一个带有 Metro 应用程序和 win32 桌面的 Windows 8 1 聊天客户端应用程序 问题是未在 Tcp 套接字上从 winrt 应用程序连接到 win32 应用程序 异常连接失败 错误未从其他计算机回复 有什么问题
  • SwiftUI [演示] / 尝试在已经演示的...上演示视图

    我正在开发一个 SwiftUI 应用程序 首先出现警告 然后出现错误 可能是因为我忽略了这些警告 我想展示我收到的警告 希望有人能指出我可能做错的事情 这是相关代码 struct CustomListView View var localL
  • 如何在 Swagger 中将 https:///swagger 更改为自定义

    我的任务是将 Swagger 安装到 Web API 项目中 已安装 来自 nuget 的最新版本的 Swashbuckle Swashbuckle Core Net45 和 Swashbuckle Net45 自定义 App Start
  • 将 .plist 文件解析为纯 XML C#

    我正在尝试使用 c 读取我的 Apple Safari 历史记录 该历史记录存储在 plist 文件中 但是我总是收到错误 并且我不确定正确的方法是什么 我尝试执行的代码是这样的 XmlDocument xmd new XmlDocumen
  • 如何使用 INotifyPropertyChanged 更新列表框项目

    我有一个列表框 它与对象集合进行数据绑定 我想修改项目的显示方式 以向用户显示这些对象之一是我的程序中的 START 对象 我尝试按照以下方式执行此操作 但列表框不会自动更新 使控制无效也不起作用 我能找到的唯一方法是完全删除数据绑定并再次
  • PHP:仅使用模数和指数进行 RSA 加密

    现在 我只有模数和指数 我应该如何在 PHP 中使用模数和指数进行加密 我花了很多时间在网上寻找答案 但毫无用处 谢谢你的时间 使用 phpseclib 一个纯粹的PHP RSA 实现 http phpseclib sourceforge
  • 在 Microsoft Bot Framework v4 中处理自适应卡 - Nodejs

    return new Promise resolve reject gt x context sendActivity text hi attachments CardFactory adaptiveCard menuJson 我正在尝试发
  • 使用 Xcode 12 访问 SwiftUI 中的 ViewModel 字段:“访问安装在视图之外的状态值”

    我认为这个错误消息对于 Xcode 12 中的 SwiftUI 来说是新的 因为它在 Google 中的点击率为 0 而消息本身相当通用 访问安装在视图之外的状态值 这将导致 Binding 的初始值恒定并且不会更新 我有以下代码 删除了一
  • HTML5 服务器发送的事件:如何设置 withCredentials 选项?

    根据WHATWG 服务器发送的事件 http www whatwg org specs web apps current work multipage comms html eventsource下面是使用的API事件源界面 Constru
  • 将数据表导出到 Excel asp

    我有一个将数据导出到 Excel 文件的网页 我遇到的唯一问题是 当我尝试打开 Excel 文件时 我收到一条消息 您尝试打开的文件的格式与文件扩展名指定的格式不同 请验证该文件未损坏并且来自打开文件之前的可信来源 我怎样才能摆脱这个消息
  • 追加 ArrayBuffer

    附加 组合 ArrayBuffer 的最佳方式是什么 我正在接收和解析具有各种数据结构的网络数据包 传入的消息被读入 ArrayBuffer 如果部分数据包到达 我需要存储它并等待下一条消息 然后重新尝试解析它 目前我正在做这样的事情 fu
  • DocumentApp 表:如何合并列中的单元格? [带有解决方法]

    我正在尝试使用 GAS 构建一个文档 该文档将包含一个表 该表的第一列中有一个单元格 第二列中有多个单元格 请参阅此处的示例 https docs google com document d 1e48FxrgZ7uakatBRIDAZZi
  • 使用 pandas 将多列取消列出为行

    我有一个像这样的 json 文件 A type1 2 26 288 type2 2 3 5 type3 23 26 288 B type1 2 26 288 type2 2 3 5
  • 异步请求未进入完成块

    下面的代码是为了让我更好地理解 NSURLConnection sendAsynchronousRequest queue completionHandler 有NSLog中的陈述completionHandler块 但是当我运行它时mai