在这种情况下如何设置完成块?

问题描述 投票:0回答:1

我有一个有问题的功能。下一行似乎需要延迟才能准确处理正在处理的任何数据,但没有花那么多时间,结果我得到了错误的结果。以下行:

self.failure = failure

似乎需要大约5-7秒才能执行,但是问题是,下一行代码要先执行才能完成。

我需要以以下方式设置self.failure = failure:一旦该行结束,函数中的其余代码将在完成块内执行。我只是不确定该怎么做。

我已经尝试为完成块创建typedef,但是我不知道如何以及在何处执行它。

- (void)start:(BMPlaybackStartupProcessCompleteBlock)completion
      failure:(BMPlaybackStartupProcessFailureBlock)failure // what is the error code at the start and end of this method?
    {
        NSParameterAssert(completion);
        NSParameterAssert(failure);

        self.completion = completion;
        self.failure = failure;

        NSOperation *jailBreakOperation = [self jailBreakCheckOperation];
        NSOperation *metadata = [self metadataOperation];
        NSOperation *ads = [self adsOperation];
        NSOperation *mediaPlayer = [self mediaPlayerOperation];
        NSOperation *progress = [self progressTrackerOperation];
        NSOperation *final = [self finalOperation];

        [final addDependency:mediaPlayer];
        [final addDependency:progress];
        if (ads)
        {
            [final addDependency:ads];
            [ads addDependency:metadata];
        }
        [mediaPlayer addDependency:metadata];
        [progress addDependency:metadata];
        [metadata addDependency:jailBreakOperation];

        [self.queue addOperation:final];
        if (ads)
        {
            [self.queue addOperation:ads];
        }
        [self.queue addOperation:mediaPlayer];
        [self.queue addOperation:progress];
        [self.queue addOperation:metadata];
        [self.queue addOperation:jailBreakOperation];

                // INPUTS:
        //  - content ID
        //  - metadata component
        //  - media player component
        //  - ads component
        //  - location manager if required
        //  - auto play?

        // OUTPUTS:
        //  - Possibly an error if not successful
        //  - metadata
        //  - playback details
}

我希望self.failure = failure在NSOperationQueue东西执行之前完成。

objective-c objective-c-blocks
1个回答
0
投票

NSOperation具有completionBlock属性。

@property(copy) void (^completionBlock)(void);

因此您可以执行这样的操作。如果发生,这将处理失败。

    Create `error` block level property to save error while operation. 

    nsOperatorObject.completionBlock(^{
        if (self.error) {
          self.failure();
        } else {
          self.completion();
        }
    });

这可能是错误的答案。抱歉:)

© www.soinside.com 2019 - 2024. All rights reserved.