【问题标题】:NSoperation reverse dependenciesNSoperation 反向依赖
【发布时间】:2013-10-02 08:24:06
【问题描述】:

在我的一个应用程序中,我有一个 NSOperationQueue 和一些 NSOperations 的子类。 我添加了一些依赖项,所以操作 A 直到操作 B 完成才开始。

如果操作 B 失败,我需要取消操作 A,但是从操作 B 内部,我没有任何依赖于当前操作的操作列表。

我会尝试在我的子类上添加一些弱属性,比如

@property (nonatomic, weak) NSArray *dependsOnMe;

但我害怕产生一些奇怪的循环。

谢谢

【问题讨论】:

  • 弱 NSArray 属性不会做你想做的事:它会弱引用数组,而不是它的元素。一旦您失去对它的其他引用,该数组可能会被释放。

标签: ios objective-c nsoperation nsoperationqueue


【解决方案1】:

虽然我在讨论中已经很晚了,但这是我为帮助我获得 NSOperation 的反向依赖项而编写的内容。如果你知道使用的队列,那么你可以使用这个扩展:

extension NSOperationQueue {
    func reverseDependenciesForOperation(op: NSOperation) -> [NSOperation] {
        return operations.filter { $0.dependencies.contains(op) }
    }
}

【讨论】:

    【解决方案2】:

    这里有一些缺失的信息。就像你构造 B 时一样,你也构造 A 吗?

    有必要这样做吗?为什么不在 B 成功完成后构造 A?

    如果从 B 到 A 的一对一依赖关系,您可以使用委托协议

    @protocol DependantOperationCompletion <NSObject>
    
    -(void)operationDidFail;
    
    @end
    
    @interface BOperation
    
    @property (weak) id<DependantOperationCompletion> delegate;
    
    @end
    

    @interface AOperation:NSOperation <DependantOperationCompletion> 
    
    ...
    
    @end
    

    那么当你构造操作时,将 A 设置为 B 的委托

    bOpInstance.delegate = aOpInstance;

    如果 B 失败,也可以使用“向窗外喊”的方法并发布通知。 A 监听通知。

    在B内...

    -(void)handleFailure
    {
        [[NSNotificationCenter defaultCenter] postNotificationName:BTypeOpDidFailNotification object:self userInfo:someInfoOrNil]
    
    }
    

    在 ...

    -(void)setupWithBOp:(BOperation *)binstance
    {
    
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ohNoBHazFailed:) name:BTypeOpDidFailNotification object:binstance];
    
    }
    

    记得删除 A 作为 dealloc 上的观察者

    【讨论】:

    • 回答你的问题,我更喜欢同时创建所有操作以获得更易读的代码。实际上操作链包含四个操作!
    【解决方案3】:
     I've added some dependencies so, the operation A not start until operation B finish.
    

    还有:

    I need to cancel the operation A if the operation B fails
    

    你知道这是怎么回事吗?

    如果B 失败,从B 取消B 是有意义的。但同样,A 只会在B 完成时开始。


    来自here

    依赖:你可以使一个操作依赖于其他操作。 任何操作都可以依赖于任意数量的操作。当你 使操作 A 依赖于操作 B,即使您调用 在操作 A 上“启动”,除非操作 B,否则不会启动 isFinished 是真的。例如:

    MyDownloadOperation *downloadOp = [[MyDownloadOperation alloc] init]; // MyDownloadOperation is a subclass of NSOperation
    MyFilterOperation *filterOp = [[MyFilterOperation alloc] init]; // MyFilterOperation  is a subclass of NSOperation
    
    [filterOp addDependency:downloadOp];
    

    【讨论】:

    • 对不起,我不明白这一点。 A 依赖于 B,但如果 B 失败,则必须取消 A。使用标准实现,即使 B 失败 A 也会被执行。
    • 告诉我你的表现如何A depends on B
    • 在您的示例中,filterOb 依赖于 downloadOp,这没关系。问题是即使 downloadOp 失败,filterOb 也会被执行。我需要一种从 downloadOp 实现“依赖”操作列表的方法,所以我可以在所有这些操作上调用“取消”。我用视图控制器上调用的“failureBlock”解决了这个问题,所以我可以取消所有其他操作。
    • 这不是真的。如果 downloadOp 失败,过滤器将不会被执行。这就是使用依赖项的全部意义所在。
    • 嗯...NSOperation 没有“返回值”,所以“成功”或“失败”是内部状态(如果下载正常则成功,如果下载失败则失败)。 filterOb怎么能理解downloadOp失败?
    猜你喜欢
    • 1970-01-01
    • 2012-02-20
    • 2023-04-08
    • 1970-01-01
    • 2015-03-20
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多