我如何一次运行一段代码。也就是说,我有一个你想要一致执行的代码。例如:
- (IBAction)downloadPressed:(id)sender {
//1
CGRect frameDelete = deleteButton.frame;
frameDelete.origin.y = (deleteButton.frame.origin.y-50);
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration: 0.5];
deleteButton.frame = frameDelete;
[UIView commitAnimations];
[progressLine setProgress:0];
//2 Wait until the code is executed above, and then run the code below
NSURL *fileURL = [NSURL URLWithString:@"http://intercreate.ru/all.zip"];
[self downloadDataAtURL:fileURL];
//3 Wait until the code is executed above, and then run the code below
CGRect frameDelete1 = deleteButton.frame;
frameDelete1.origin.y = (deleteButton.frame.origin.y+50);
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration: 0.5];
deleteButton.frame = frameDelete1;
}
也就是说,我希望我的代码分为三个部分:
我该怎么做?
答案 0 :(得分:1)
这样做的传统方式是协议/委托设计模式。然而,由于块,这已经过时了。它们是实现这一目标的最简单方法。例如,它们内置于优秀的MBProgressHUD。你可以用这个来完成你想要的东西:
- (IBAction)downloadPressed:(id)sender {
CGRect frameDelete = deleteButton.frame;
frameDelete.origin.y = (deleteButton.frame.origin.y-50);
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration: 0.5];
deleteButton.frame = frameDelete;
[UIView commitAnimations];
[progressLine setProgress:0];
MBProgressHUD *aHud = [[MBProgressHUD alloc] initWithView:self.view];
[aHud showHudAnimated: NO whileExecutingBlock:^
{
//2 Wait until the code is executed above, and then run the code below
NSURL *fileURL = [NSURL URLWithString:@"http://intercreate.ru/all.zip"];
[self downloadDataAtURL:fileURL];
} completionBlock: ^
{
//3 Wait until the code is executed above, and then run the code below
CGRect frameDelete1 = deleteButton.frame;
frameDelete1.origin.y = (deleteButton.frame.origin.y+50);
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration: 0.5];
deleteButton.frame = frameDelete1;
[UIView commitAnimations];
}]; }
进步HUD可以做得更多,例如显示进度指示器:))
查看此帖子中的块使用情况:link
答案 1 :(得分:1)
上半部分可以使用较新的基于块的动画关闭,您可以提供动画完成时执行的一段代码。第二部分我肯定会使用通知,您可以在文件下载完成后发布通知,然后您的代码的任何其他部分可以以任何方式响应此事件,更改GUI,通知用户,删除要下载的内容列表,您还可以添加新内容来收听此通知,而无需更改原始代码。
答案 2 :(得分:0)
您似乎使用旧式beginAnimations
commitAnimations
方法。
如果转到基于块的新动画方法,则可以使用完成处理程序块,如果使用异步URL下载方法,API还提供了添加完成块的位置。
所以,基本上:
因为这些都是基于一个块的方法(原始动画块),所以各个动作将一个接一个地发生。