在另一个块中执行块
Executing block inside another block
定义:
NSDictionary * (^blockThatReturnsADict)(void)
实施:
blockThatReturnsADict block = ^NSDictionary *(void) {
[SomeClass fetchADictionaryForKey:@"key" onSuccess:^(NSDictionary* dict) {
//how do i return dict from here?
}];
}
这是一个重新考虑设计是否合乎逻辑的用例?
更新
'fetchADictionaryForKey' 块是异步的。所以我想我不能只声明一个块变量,然后 return 它。
您 运行 进入了 futures 和 promises 可以解决的标准 class 问题,因此您有两个高级选项:
1) 采用 promise 库或框架,并在任何地方使用 promises,假设您需要大量顺序异步块。
或
2) 如果你没有那么多,那么使用相同的机制 iOS 通常使用:成功回调。
对于您的情况,简单的解决方法可能是 #2。传入一个成功块(而不是 void),然后在你的内部块中使用你的结果调用成功块。
您不会 return 来自异步块的结果(因为您显然不能)。异步块将结果设置在适当的位置。例如,您的对象可能有一个 属性 resultDict,而回调只是说
self.resultDict = dict;
定义:
NSDictionary * (^blockThatReturnsADict)(void)
实施:
blockThatReturnsADict block = ^NSDictionary *(void) {
[SomeClass fetchADictionaryForKey:@"key" onSuccess:^(NSDictionary* dict) {
//how do i return dict from here?
}];
}
这是一个重新考虑设计是否合乎逻辑的用例?
更新
'fetchADictionaryForKey' 块是异步的。所以我想我不能只声明一个块变量,然后 return 它。
您 运行 进入了 futures 和 promises 可以解决的标准 class 问题,因此您有两个高级选项:
1) 采用 promise 库或框架,并在任何地方使用 promises,假设您需要大量顺序异步块。
或
2) 如果你没有那么多,那么使用相同的机制 iOS 通常使用:成功回调。
对于您的情况,简单的解决方法可能是 #2。传入一个成功块(而不是 void),然后在你的内部块中使用你的结果调用成功块。
您不会 return 来自异步块的结果(因为您显然不能)。异步块将结果设置在适当的位置。例如,您的对象可能有一个 属性 resultDict,而回调只是说
self.resultDict = dict;