在Objective-c中排队

时间:2012-12-16 11:04:00

标签: objective-c xcode queue dispatch

我如何一次运行一段代码。也就是说,我有一个你想要一致执行的代码。例如:

- (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;  

}

也就是说,我希望我的代码分为三个部分:

  1. 第一次向上移动旋钮
  2. 下载文件
  3. 退回按钮。
  4. 我该怎么做?

3 个答案:

答案 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还提供了添加完成块的位置。

所以,基本上:

  1. 创建基于块的动画以移动按钮
  2. 在此动画的完成处理程序中触发异步下载
  3. 在下载的完成处理程序中触发一个动画来移动按钮。
  4. 因为这些都是基于一个块的方法(原始动画块),所以各个动作将一个接一个地发生。