强制一种方法等待另一种方法完成

2023-12-08

在我的原始视图控制器中,在转到目标视图控制器之前,我调用一个获取关键参数的方法,然后在以下方法中在目标视图控制器中设置关键参数。然而,关键参数是在之前设置的doSomethingToGetKey方法已完成,因此传递了一个空值。我想知道是否有办法让第二种方法等待第一个方法完成。

原点视图控制器:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

[self doSomethingToGetKey];
[segue.destinationViewController setKey:_key];
}

-(void)doSomethingToGetKey:(ACAccount *)account{

[_apiObject postReverseOAuthTokenRequest:^(NSString *authenticationHeader) {

    APIObject *api = [APIObject APIOSWithAccount:account];
    [api verifyCredentialsWithSuccessBlock:^(NSString *username) {


        [api postReverseAuthAccessTokenWithAuthenticationHeader:authenticationHeader successBlock:^(NSString *oAuthToken, NSString *oAuthTokenSecret, NSString *userID, NSString *screenName) {

            _key = oAuthToken;
            _secret = oAuthTokenSecret;
            _userId = userID;



        } errorBlock:^(NSError *error) {

            NSLog(@"ERROR 1, %@", [error localizedDescription]);
            exit(1);

        }];

    } errorBlock:^(NSError *error) {

        NSLog(@"ERROR 2: %@",error.description);
        exit(1);

    }];

} errorBlock:^(NSError *error) {

    NSLog(@"ERROR 3: %@",error.description);
    exit(1);

}];

};

一般来说,该模式涉及使用完成块,例如:

- (void) doSomethingToGetKeyWithCompletionHandler:(void (^)(NSString *key))completion
{
    // perform asynchronous request

    // in its completion handler, call the `completion` block parameter given above

    [api doingSomeOtherAsynchronousMethodWithCompletion:^{
        completion(key);
    }];
}

然后,代替:

[self doSomethingToGetKey];
[self doSomethingElseWithKey:_key];

你可以这样做:

[self doSomethingToGetKeyWithCompletionHandler:^(NSString *key){
    [self doSomethingElseWithKey:key];
}];

但是,在这种情况下,您尝试在内部完成所有这些操作prepareForSegue。这完全改变了问题,因为在调用此异步方法之前,segue 仍将执行,从而违背了此完成块模式的目的。

因此,您还想更改按钮(或其他按钮)以不执行转场本身,而是调用IBAction,然后有that以编程方式执行segue(如图所示)。因此,你最终会得到一个IBAction like:

- (IBAction)tappedButton:(id)sender 
{
    // perhaps update UI so user knows something slow is happening first, 
    // e.g., show a `UIActivityIndicatorView`

    [self doSomethingToGetKeyWithCompletionHandler:^(NSString *key){

        // remove that `UIActivityIndicatorView`, if you showed one

        [self performSegueWithIdentifier:@"Details" sender:self];
    }];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"Details"]) {
        [segue.destinationViewController setKey:_key]
    }
}

或者,您可以删除所有这些,只执行 segue,然后让目标视图控制器出现,显示活动指示器视图,执行 api 调用,然后删除活动指示器视图。这是对代码的更戏剧性的重构,但可能是更好的用户体验。

但是,底线是从内部prepareForSegue即使您使用完成块模式,您也不能执行异步操作,并期望目标视图控制器等待它。你必须使用IBAction如果您想在执行转场之前完成所有这些操作,请使用此方法。或者,就像我在这里建议的那样,只需在目标视图控制器中执行所有这些异步请求即可。由于某种原因,立即转换到目标视图控制器(并显示UIActivityIndicatorView那里)比延迟目标视图控制器的呈现更令人满意的用户体验(即使它们在功能上非常相似)。

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

强制一种方法等待另一种方法完成 的相关文章

  • 当 isUserInteractionEnabled false 时,SKSpriteNode 不会让触摸通过

    我正在尝试在 SpriteKit 中创建一个覆盖层 方法是使用SKSpriteNode 但是 我希望触摸穿过覆盖层 所以我设置isUserInteractionEnabled为假 然而 当我这样做时 SKSpriteNode似乎仍然吸收所有
  • 如何检测用户是否第一次打开应用程序[重复]

    这个问题在这里已经有答案了 是否可以检测用户是否是第一次打开iOS应用程序 使用Objective C 我想在用户第一次打开应用程序时显示欢迎消息 但之后不再向他们显示 我正在寻找类似的东西 BOOL firstTime AppDelega
  • 如何动态获取 UITableViewCell 的高度

    我创建了自定义的tableViewCell 我在UITableViewCell中添加了UIView SubView 所以我在 UIView 中的所有动态文本和图像内容都会根据文本和图像大小而变化 但现在 HeightforRowAtInde
  • 错误消息:您输入的捆绑包 ID 已被使用

    我正在尝试发布一个 iPhone 应用程序 这不是第一个 我过去已经发表过其他的 因此 我在第一个和第二个表单中输入了所需的信息 然后填写了第三个大表单 您还可以在其中上传图标和屏幕截图 好吧 我在上传屏幕截图之前按下了 保存 按钮 因为我
  • Flutter 应用程序在 iOS 平台的 firebase 电话身份验证中崩溃

    我在我的项目中实现了 Firebase Phone auth 在 Android 端 一切正常 但对于 iOS 端 当我尝试从我的端发送验证码时 应用程序崩溃并失去连接 我已在下面提交了我的代码 主程序 dart class MyApp e
  • SwiftUI 意外地自动弹出 NavigationLink

    我有一个简单的用例 其中一个屏幕使用 NavigationLink 推送另一个屏幕 iOS 14 5 有一个奇怪的行为 即推送的屏幕在被推送后立即弹出 Code NavigationLink destination EmptyView Em
  • 如何为 iPhone 6+、6 和 5 指定不同尺寸?

    我想让 iPhone 6 6 和 5 上的视图看起来几乎相同 在附图中 我的意思是 例如 取消 按钮在 iPhone 5 中距离屏幕左边缘应为 30 像素 在 6 中为 35 像素 在 6 中为 45 像素 其他元素也类似 如何为每种类型设
  • 有没有办法在 Firebase 中等待查询完成?

    我正在使用 TableView 在 Viewcontroller 中的 iOS 应用程序中进行查询 我想确保在继续加载 TableView 之前我的查询已经返回 有没有办法保证查询已经完成 None
  • 在 iOS 7 中 viewForHeaderInSection 部分是从 1 开始而不是从 0 开始

    我正在处理UITableView在我的项目中 这个项目是在 Xcode 4 5 中创建的 现在我正在使用 Xcode 5 所以我的问题是何时在 iOS 6 中运行我的项目 viewForHeaderInSection方法部分从 0 开始没问
  • jQuery:离线后 POST 出错(iOS 和 Chrome)

    我构建了一个具有离线功能的 HTML5 Web 应用程序 使用 AppCache 程序流程为 Online 在网络上时 应用程序预加载一些基本信息 工作 Offline 用户拿着装有应用程序的平板电脑offline 然后在应用程序上执行他们
  • 如何删除 UITableView 中的缩进?

    首先 我对此很陌生 我很可能忘记了一些非常简单的事情 问题 我正在制作一个应用程序 在 a 中显示来自 imgur com 的随机图像tableView 由于某种原因 所有单元格都会缩进少量 如下图所示 我摆弄了许多设置storyboard
  • 在 iOS 上使用 RNCryptor 异步解密大文件

    我需要在 iOS 上使用 RNCryptor 异步解密一个大文件 以便显示进度条 我在任何地方都找不到示例 因此尝试了我猜对的方法 但是 我想出的方法不起作用 解密器的处理程序从未被调用 并且线程在发送所有数据后因 EXC BAD ADDR
  • CATextLayer 上 iOS 6 中不需要的垂直填充

    背景 我在 iOS 5 中开始了我的项目 并构建了一个带有图层的漂亮按钮 我在按钮上添加了一个 textLayer 并使用以下代码将其居中 float textLayerVerticlePadding self bounds size he
  • UICollectionView setLayout:animated: 不保留 zIndex

    我注意到打电话时setLayout animated in a UICollectionView要在两个布局之间切换 当前可见的单元格不遵循zIndex它的布局属性已设置在layoutAttributesForItemAtIndexPath
  • 有没有办法在 onclick 触发时禁用 iPad/iPhone 上的闪烁/闪烁?

    所以我有一个有 onclick 事件的区域 在常规浏览器上单击时 它不会显示任何视觉变化 但在 iPad iPhone 上单击时 它会闪烁 闪烁 有什么办法可以阻止它在 iPad iPhone 上执行此操作吗 这是一个与我正在做的类似的示例
  • ios8 键盘高度有所不同

    我使用下面的代码来获取键盘高度 该高度在带有 ios8 的 iPhone 5s 设备中与带有 ios7 的 IPhone4s 设备中有所不同 因此 当我在带有 ios8 的 iPhone5s 中点击它时 我的文本字段移动得非常高 而相同的代
  • Mac 上的 Delphi - 可能吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我负责一个 Delphi Win32 项目管理应用程序 我刚刚完成了向 Delphi 2009 的迁移
  • 上传存档错误:“缺少 iOS 发行版签名身份......”

    我正在尝试使用 Xcode 将我的 iOS 应用程序存档上传到 iTunes Connect 但是当我单击 上传到 App Store 时 出现错误 Xcode 尝试查找或生成匹配的签名资产并 由于以下问题未能做到这一点 缺少 iOS 为
  • Unwind segue 的用途是什么以及如何使用它们?

    iOS 6 和 Xcode 4 5 有一个称为 Unwind Segue 的新功能 展开转场可以允许过渡到故事板中场景的现有实例 除了 Xcode 4 5 发行说明中的 这个简短条目之外 UIViewController 现在似乎还有几个新
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • Flutter:更新列表中的特定索引(Firestore)

    究竟如何根据索引更新列表中的特定值 例如 在以下列表中 0 first name name0 last name lastName0 1 first name name1 last name lastName1 如何仅更新 lastName
  • glassfish 的基本身份验证失败

    首先 我对这篇长文表示歉意 这是我之前问题的延续 7u21更新后弹出需要验证的窗口 关于这个问题 但我缩小了搜索范围 简而言之 自 Java 7u21 以来 我的 BASIC 身份验证似乎已被破坏 通过 JNLP 文件启动的小程序根本无法稳
  • 使用清晰的代码行异步调用插槽,无需连接到它

    我遇到了相当奇怪的错误 QAction trigger导致出现阻塞对话框 这导致我的服务器调用trigger卡住 例如 在对话框关闭之前无法处理套接字信号 我想出了一个解决方法 我连接信号void triggerWorkaround 到插槽
  • 模态中的文本字段

    如果我们使用列表视图 当键盘出现时 文本字段就会上升 但在模式中则不会 抱歉 我不知道如何正确解释它 我只会用图像向您展示 模式代码 showModalBottomSheet shape RoundedRectangleBorder bor
  • ASP.NET Web 应用程序消息框

    在 asp net windows 窗体应用程序中 您可以在后面的 C 代码中使用 MessageBox Show Here is my message ASP NET Web 应用程序中有类似的东西吗 我可以从后面的 C 代码中调用一些向
  • 有人可以澄清 Android 上下文引用吗?

    我的误会还在继续 任何人都可以引用正确使用的参考资料get Context 我得到了关于使用的相互矛盾的建议getBaseContext getApplicationContext and getContext 我的理解是使用this是一个
  • 如何在VIPS中进行透视扭曲变换?

    是否可以执行以下 ImageMagick透视扭曲使用 VIPS 命令 如果是这样 命令是什么 使用ruby vips convert my file png matte virtual pixel transparent distort P
  • 为小字符增大 SKLabelNode 的触摸区域

    我在我的游戏中添加了一个老式的高分输入屏幕 用户点击每个字母来输入他们的名字 每个字母 符号或短语 DEL SP 等 都是一个SKLabelNode而且点击 和 非常困难 不过字符和一些符号 每次点击都会通过通常的方式检测到touchesB
  • 在 x86-64、skylake 上以可重启序列优化 percpu 2 级位向量

    我很好奇如何最好地优化下面的程序集 特别是 跳到此处查看程序集 下的代码块中的部分 以便于 control f 搜索 我正在编写一些代码 HOT HOT HOT 路径基本上是在位向量中查找 0 位并返回该位 位向量由以下部分组成 struc
  • 如何使用 jQuery 查找文本并替换

    我试图找到一个解决方案来搜索 DOM 中包含的文本字符串 Tony 并将其替换为文本字符串 Tiger 有人对如何做到这一点有任何见解或想法吗 我猜它需要每个语句加上替换函数并且可能包含 谢谢 杰克 您可以使用它来搜索 body 元素的所有
  • Symfony2:AJAX请求:如何在需要时处理身份验证?

    使用 Symfony2 我实现了 AJAX 操作来管理应用程序中的一些书签 添加 删除 因此 用户需要经过身份验证才能继续 我有一个将用户重定向到登录页面的解决方案 但我认为最好使用事件来处理此重定向 实际解决方案 检查用户身份验证的方式与
  • 将条件应用于 MongoDB 中同一字段的多个文档

    我有一个具有以下结构的文档 user id 123 tag tag1 user id 123 tag tag2 user id 123 tag tag3 user id 456 tag tag1 给定用户 ID 我想查找该用户是否拥有包含所
  • 如何在 phing 中迭代(循环)目录?

    我想为一些插件创建 phing 任务 所以目录结构类似于 root plugin1 index php plugin2 index php etc 我想在每个子目录上运行相同的任务 例如 为plugin1生成文档 为plugin1运行单元测
  • Python MySQLdb 字符串替换不添加引号

    我想对逗号分隔的列表使用字符串替换 例如 query SELECT id name image id FROM users WHERE id IN s values join uids results dbc getAll query va
  • Java中的邻接矩阵

    我对图表和邻接矩阵感到非常困惑 我正在为一个类做作业 其中我有一个节点的文本文件和一个边的文本文件 我必须读取它们中的每一个并将它们制作为一个图表 然后我可以在其中执行操作 例如确定图表是否是连接 寻找最小生成树 遍历并寻找路径 不过 我以
  • 带有嵌入字体的 @font-face 不起作用

    我有网站 http kuvaklubi fi我尝试使用字体的地方 Century Gothic 我的电脑上不存在此字体 Installed fonts 我想通过以下方式将此字体嵌入到 css 中 font face 我已经生成了一些字体文件
  • django.db.backends.dummy 和 django.db.backends.mysql 有什么区别?

    django db backends dummy 和 django db backends mysql 有什么区别 我发现有人使用dummy和mysql 但我搜索后不知道他们的区别 django db backends mysql后台数据库
  • 获取类层次结构的所有字段[重复]

    这个问题在这里已经有答案了 我有课 ClassA public String filedA ClassB extends ClassA public String filedB ClassC extends ClassB public St
  • 使用spatiallite 将 GIS 缓冲值度以米为单位

    我是 Spatialite 的新手 我有以下查询 select A from linka as A pointa as B where Contains Buffer B Geometry 100 A Geometry 我实际上想创建 10
  • 强制一种方法等待另一种方法完成

    在我的原始视图控制器中 在转到目标视图控制器之前 我调用一个获取关键参数的方法 然后在以下方法中在目标视图控制器中设置关键参数 然而 关键参数是在之前设置的doSomethingToGetKey方法已完成 因此传递了一个空值 我想知道是否有