加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – 完成块?嵌入在同步工作流中的异步流程

发布时间:2020-12-14 18:06:14 所属栏目:百科 来源:网络整理
导读:长时间潜伏,第一次海报.我对Objective-C比较陌生,所以如果我问一些相当简单的事情我会道歉.我的谷歌 stack overflow-fu让我失望了,所以我想有人可能会帮忙. 我有一个同步过程,例如,连续执行三个函数 – 称之为A – B- C,执行任务A,后跟B,然后是C. 现在,B涉及
长时间潜伏,第一次海报.我对Objective-C比较陌生,所以如果我问一些相当简单的事情我会道歉.我的谷歌& stack overflow-fu让我失望了,所以我想有人可能会帮忙.

我有一个同步过程,例如,连续执行三个函数 – 称之为A – > B-> C,执行任务A,后跟B,然后是C.

现在,B涉及一个异步进程,带有委托回调以完成.但是B必须在执行C之前完成,所以我需要一些机制,使得在B完成之前不会触发C.我想这个问题必须有一个共同的设计模式?

最初天真的解决方案是 –

执行A.
执行B.
而(!B完成){}
执行C.

……但这看起来真的很蹩脚.

我怀疑我可以通过某种阻挡来做到这一点,但对于我的生活,我无法弄明白.有人可以帮忙吗?

感谢任何帮助!

纪尧姆

解决方法

感谢所有的反馈 – 抱歉没有尽快回复.我现在以稍微不同的方式解决了这个问题:

首先,我将NSObject扩展为具有以下方法 –

#import "NSObject+LTExtensions.h"

@implementation NSObject (Testing)

- (void) performSelectorWithBlock: (SEL) selector withSemaphore:(dispatch_semaphore_t)semaphore
{
  [self performSelector:selector]; // This selector should complete the semaphore
  dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER);
  dispatch_release(semaphore);
}

@end

这允许我通过选择器执行一个块.当块执行时,执行它的线程将等待,直到通过特定的调度信号量发出信号.

那我们可以做的是如下:

>打电话给A
>创建一个调度信号量并定义一个执行B的选择器
>调用上面定义的方法执行B并等待选择器完成
>当B完成时(通过委托回调),它发信号通知调度信号量暂停等待
>然后我执行C

所以我们有

A
B -> Asynchronous with delegate callback
C

这是一个如何实现上述的简单示例

-(void) methodA {

  // ... do something

  // Assign your semaphore (this is a dispatch_semaphore_t)
  self.semaphore = dispatch_semaphore_create(0);
  [self performSelectorWithBlock:@selector(methodB) withSemaphore:semaphore];
  [self methodC];
}

-(void) methodB {
  // ... do whatever needs to be done asynchronously
  CFRunLoopRun();
}

-(void) methodBDelegateCallBack {
  // This is called when B completes

  // Signal completion
  dispatch_semaphore_signal(self.semaphore);
  CFRunLoopStop(CFRunLoopGetCurrent());
}

-(void) methodC {
 ...
}

工作得非常好,没有任何问题(但我是Obj C的新手,所以我的方法可能会有明显的问题).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读