我为此搜索了很多,但无法找到对我的具体问题的答案。但基本上我的问题是,我是否可以将完成块传递到另一个视图控制器中,并在新视图控制器中重新定义它。
例如,在视图控制器A中,我有一个使用完成块执行下载的方法。首先,在视图控制器A中创建我的块属性。
@property (copy)void (^downloadCompleteBlock)(NSArray *downloadItems);
我试过将这个标签从复制更改为加粗,但这并没有解决我的问题。
然后我如下定义完成块。
self.downloadCompleteBlock = ^(NSArray *downloadItems) {
NSLOG(@"download complete in view controller A";
};
然后我调用我的下载方法,并传递这个完成块。
[self download:self.downloadCompleteBlock];
然而,如果在我离开这个视图控制器时(如果下载未完成),此完成处理程序未被调用,则我希望完成块在下一个视图控制器上执行不同的操作。因此,在我的“prepare for segue”方法中,我尝试将此块传递给B视图控制器。
[controllerB setCompletionBlock:self.downloadCompleteBlock];
在视图控制器B中,这个方法重新定义了当完成块被调用时发生的事情。
- (void)setCompletionBlock:(void(^)(NSArray *downloadItems))downloadFinishedBlock {
downloadFinishedBlock = ^(NSArray *downloadItems) {
self.collectionData = downloadItems;
[self.collectionView reloadData];
};
然而,当下载完成时,与视图控制器B中的块相反,仍会调用视图控制器a中的原始块。有人知道如何在下载完成之前调用视图控制器B中的完成块吗?我知道我可以使用通知程序,但我很好奇是否可以使用块来实现这一点。
谢谢
int
的行为是相同的。 - jscs