Ios 用于同步多部分异步调用的模式

Ios 用于同步多部分异步调用的模式,ios,objective-c,asynchronous,Ios,Objective C,Asynchronous,我试图找到一种模式来同步多部分异步操作。假设操作系统提供了一个可以启动/停止的服务。以以下为例: 开始被称为。请求守护进程启动 守护进程成功响应。执行其他一些操作,例如设置必要的操作状态 守护进程响应,我们完成了 我想要的是防止活动重叠。当我说的时候。正在处理发出的停止请求(或另一个启动)。该请求必须保留到3点。完成 我知道并且实际上正在使用它们,但它们阻止了每个步骤的重叠,而不是整个操作。我尝试过使用锁,但我从iOS上得到一个即时日志,告诉我发生了死锁(直到3.0完成我才释放锁)。我也尝试过一

我试图找到一种模式来同步多部分异步操作。假设操作系统提供了一个可以启动/停止的服务。以以下为例:

  • 开始被称为。请求守护进程启动
  • 守护进程成功响应。执行其他一些操作,例如设置必要的操作状态
  • 守护进程响应,我们完成了
  • 我想要的是防止活动重叠。当我说的时候。正在处理发出的停止请求(或另一个启动)。该请求必须保留到3点。完成

    我知道并且实际上正在使用它们,但它们阻止了每个步骤的重叠,而不是整个操作。我尝试过使用锁,但我从iOS上得到一个即时日志,告诉我发生了死锁(直到3.0完成我才释放锁)。我也尝试过一些特别的方法,但它们已经暴露出难以使用的问题。我最后一次尝试:

    @interface HYPAtomizer : NSObject
    
    // Indicates that the operation is running. A start request was successful    
    @property (readonly) BOOL isRunning;
    
    // Whether the operation/daemon should be running
    @property (readonly) BOOL isRunningRequested;
    
    // Whether we are currently processing a request
    @property (readonly) BOOL isProcessing;
    
    // Whether an error occurred
    @property (readonly) NSError * error;
    
    - (instancetype)init NS_DESIGNATED_INITIALIZER;
    + (instancetype)atomizer;
    
    // These methods return YES if I should proceed with the request, meaning that it's not overlapping
    - (BOOL)startIfPossible;
    - (BOOL)stopIfPossible;
    
    // Call these by the time a request finishes. They will say whether to revert the process, meaning that a request happened during processing that requires the state to turn back (such as a stop request being issued during a start process)
    - (BOOL)revertStartIfNeeded:(NSError *)error;
    - (BOOL)revertStopIfNeeded:(NSError *)error;
    
    // A spontaneous stoppage occurred, such as the daemon stopping by itself
    - (void)notifyStoppage:(NSError *)error;
    
    @end
    
    然后我在关键点调用这些方法,但事实证明很难找到这些关键点。有标准的方法吗

    出于澄清目的编辑:

    任何给定活动的步骤都不会重复,但也不是强制性的。因此,启动操作可以执行1、2和3,但如果该步骤检测到错误且3从未执行,则也可以在2处停止。步骤不重复,因此1、2、2、2、2、3不可能。这些情况是可能的:

    [lock] 1, 2 - fail [unlock]
    [lock] 1, 2, 3 - success [unlock]
    
    如果同时(在我等待守护进程的过程中)尝试任何其他操作,无论是启动还是停止,都不应该执行,而是更新一个指示当前状态的标志。假设
    (开始)
    是一个开始请求,
    (停止)
    是相反的活动。将发生以下情况:

    (start) [lock] 1, 2, 3 [unlocked] (stop) [lock] 1, 2 [unlock]
    (start) [lock] 1, 2, (stop), 3 [unlock] [lock] 1, 2 [unlock]
    
    上一个示例中的
    (stop)
    请求由外部源调用,它不是启动过程的一部分。正如你所看到的,在start完成时,我希望它停止,因为它是同时被请求的。最后,如果有更多操作重叠:

    (start) [lock] 1, (stop), 2, (start), 3 [unlock] - nothing happens
    
    在这种情况下,什么也不会发生,因为当进程完成时,它已经处于最后请求的状态(start)


    编辑:顺便说一句,我正在考虑实现一个简单的锁机制,如所述。

    承诺模式是为这种情况设计的。我发现PromiseKit是iOS上的一个很好的实现。链接是您正在寻找的功能


    承诺模式是为这种情况而设计的。我发现PromiseKit是iOS上的一个很好的实现。链接是您正在寻找的功能


    您听说过NSOperationQueue类吗?我想那正是你要找的东西。您可以很容易地定义优先级、相关性、取消单个操作等。漂亮整洁的API。只需查看文档(很抱歉没有发布直接链接)。

    您听说过NSOperationQueue类吗?我想那正是你要找的东西。您可以很容易地定义优先级、相关性、取消单个操作等。漂亮整洁的API。只需检查文档(很抱歉没有发布直接链接)。

    您可以为NSOperations设置completionBlock(),您可以将其与manager类上的singleton属性一起用于检查您的状态等

    设置startOperation,对于startOperation.completionBlock,使用类似startOperation.completionBlock=^{[[DaemonManager defaultManager]checkIfStopRequestedAndHandle];}


    使用completionBlock、addDependency以及isCancelled和isFinished,您应该有足够的工具来定制您认为合适的执行步骤/依赖项

    您可以为NSOperations设置completionBlock(),您可以将其与manager类上的单例属性一起使用,以检查您的状态等

    设置startOperation,对于startOperation.completionBlock,使用类似startOperation.completionBlock=^{[[DaemonManager defaultManager]checkIfStopRequestedAndHandle];}


    使用completionBlock、addDependency以及isCancelled和isFinished,您应该有足够的工具来定制您认为合适的执行步骤/依赖项

    您是否研究过使用
    NSOperation
    和依赖项?这里有一篇很好的文章,可以让你继续写下去。您可能需要将3个步骤中的每一个子类化为单独的
    NSOperations
    ,然后在它们之间添加依赖项。嗯,很接近,但不是很接近。我似乎和GCD有同样的问题。当一个活动完成时,将获取下一个活动,但这不能发生。促使这种情况发生的原因是,我必须等待守护进程响应,直到我关闭活动。您知道如何在这种情况下应用
    NSOperation
    吗?不清楚您的原子操作是什么?1,2和3是否应在允许另一个1,2和3序列之前完成?单个请求者是否可以实际请求操作1、2、2、2…3?当其他请求者请求1而3已经发生时,他们应该怎么办?请求是否失败、阻塞或队列未阻塞?如果其他人已经启动了守护进程,另一个请求者是否可以请求2?是不是1和3的具体重叠才是问题所在?请看我的编辑!有帮助吗?您是否研究过使用
    NSOperation
    和依赖项?这里有一篇很好的文章,可以让你继续写下去。您可能需要将3个步骤中的每一个子类化为单独的
    NSOperations
    ,然后在它们之间添加依赖项。嗯,很接近,但不是很接近。我似乎和GCD有同样的问题。当一个活动完成时,将获取下一个活动,但这不能发生。促使这种情况发生的原因是,我必须等待守护进程响应,直到我关闭活动。您知道如何在这种情况下应用
    NSOperation
    吗?不清楚是什么