我相信我的用例相当普遍,但我找不到任何能让我 100% 确定自己在做什么的文档。任何指针表示赞赏。
在我的应用程序的某个时刻,我开始下载一个对象。之后,用户可以单击按钮。如果对象完成下载,我想执行一些代码。否则我想等到对象被下载并执行相同的代码。如果用户不点击按钮,我不想做任何事情。下载的对象丢失。
我的基本想法是做这样的事情:
NSObject *myObj = nil;
- (void)download {
[self downloadObj:^(NSObject *obj){
myObj = obj;
}];
}
- (void)buttonClicked {
waitOrExecuteDirectly:^{
// Some code with myObj
}
}
当然,第一个问题是“我该如何等待?”
所以我尝试了
- (void)buttonClicked {
if(myObj) {
// Some code
} else {
// Wait then do the exact same code
}
}
但我认为更棘手的问题是“如果在计算“if”之后和输入“else”块之前对象完成下载会发生什么?
我试图将下载封装在一个NSOperation
并使用该completionBlock
属性。但是,如果在我设置回调时操作已经完成,则永远不会调用 completionBlock。我不想在“下载”方法中设置回调,因为用户可能不会点击按钮。
是否有内置机制允许我根据任务状态为将等待或直接执行的任务提供完成回调?如果没有,我自己做的最佳做法是什么?NSLock
设置和阅读时使用myObj
?