Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSO操作反向依赖项_Ios_Objective C_Nsoperation_Nsoperationqueue - Fatal编程技术网

Ios NSO操作反向依赖项

Ios NSO操作反向依赖项,ios,objective-c,nsoperation,nsoperationqueue,Ios,Objective C,Nsoperation,Nsoperationqueue,在我的一个应用程序中,我有一个NSOperationQueue和一些NSOperations子类。 我添加了一些依赖项,因此,操作A在操作B完成之前不会启动 如果操作B失败,我需要取消操作A,但是从操作B内部,我没有任何依赖于当前操作的操作列表 我将尝试在我的子类上添加一些弱属性,如 @属性(非原子,弱)NSArray*dependsOnMe 但我害怕产生一些奇怪的循环 谢谢 以及: 你看到了吗 如果B失败,那么从B取消B是有意义的。但同样地,A只有在B完成时才会启动 发件人: 依赖性:您可以

在我的一个应用程序中,我有一个NSOperationQueue和一些NSOperations子类。 我添加了一些依赖项,因此,操作A在操作B完成之前不会启动

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

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

@属性(非原子,弱)NSArray*dependsOnMe

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

谢谢

以及:

你看到了吗

如果
B
失败,那么从
B
取消
B
是有意义的。但同样地,
A
只有在
B
完成时才会启动


发件人:

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


这里缺少一些信息。比如当你构造B的时候,你也构造了A吗

有必要这样做吗?为什么不在B成功完成的基础上构建A

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

@protocol DependantOperationCompletion <NSObject>

-(void)operationDidFail;

@end

@interface BOperation

@property (weak) id<DependantOperationCompletion> delegate;

@end

-(void)setupWithBOp:(BOperation *)binstance
{

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ohNoBHazFailed:) name:BTypeOpDidFailNotification object:binstance];

}

请记住在
dealloc

上删除作为观察者的角色,尽管我在讨论中已经晚了很多,但以下是我为帮助我获得NSO操作的反向依赖关系而编写的内容。如果您知道使用的队列,则可以使用此扩展:

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

对不起,我不明白重点。A取决于B,但如果B失败,则必须取消A。使用标准实现,即使B失败,也将执行A。向我展示您的操作方式
A取决于B
。在您的示例中,filterOb依赖于downloadOp,这是确定的。问题是,即使downloadOp失败,FilterRob也会被执行。我需要一种方法从downloadOp实现“依赖”操作列表,这样我就可以调用所有这些操作的“取消”。我通过在我的viewcontroller上调用一个“failureBlock”解决了这个问题,这样我就可以取消所有其他操作了。事实并非如此。如果downloadOp失败,则不会执行筛选器。这就是使用依赖项的全部意义。嗯……NSOperation没有“返回值”,所以“成功”或“失败”是内部状态(下载正常时成功,下载失败时失败)。FilterRob怎么能理解downloadOp失败?弱NSArray属性不会做您想要的事情:它将弱引用数组,而不是它的元素。一旦您丢失对该数组的其他引用,该数组可能会被释放。为了回答您的问题,我宁愿同时创建所有操作,以获得更可读的代码。实际上,操作链包含四个操作!
@protocol DependantOperationCompletion <NSObject>

-(void)operationDidFail;

@end

@interface BOperation

@property (weak) id<DependantOperationCompletion> delegate;

@end
@interface AOperation:NSOperation <DependantOperationCompletion> 

...

@end
-(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];

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