Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone iOS使用UIView animateWithDuration块执行操作的正确方法是什么?_Iphone_Objective C_Ios_Animation_Uiview - Fatal编程技术网

iPhone iOS使用UIView animateWithDuration块执行操作的正确方法是什么?

iPhone iOS使用UIView animateWithDuration块执行操作的正确方法是什么?,iphone,objective-c,ios,animation,uiview,Iphone,Objective C,Ios,Animation,Uiview,我在想,响应用户事件的“长”操作的正确方法是什么。例如,我有一张幻灯片来取消在0.5秒内在屏幕外设置动画的块。[self-coreDataAction]本身可能需要约0.3秒 我希望确保在用户看到动画结束时动作完成(我不希望用户意外导航到其他控制器或关闭应用程序以为动作完成) 我应该把[self-coreDataAction]放在哪里在这种情况下?在块上方、块内还是在完成块中 //should I put it here? CGPoint slideToCancelCenter = slid

我在想,响应用户事件的“长”操作的正确方法是什么。例如,我有一张幻灯片来取消在0.5秒内在屏幕外设置动画的块。
[self-coreDataAction]
本身可能需要约0.3秒

我希望确保在用户看到动画结束时动作完成(我不希望用户意外导航到其他控制器或关闭应用程序以为动作完成)

我应该把
[self-coreDataAction]放在哪里在这种情况下?在块上方、块内还是在完成块中

//should I put it here?

 CGPoint slideToCancelCenter = slideToCancel.view.center;
    [UIView animateWithDuration:0.5 animations:^{
        self.goToSleepButton.center = slideToCancelCenter;
        [UIView setAnimationDuration:0.5];
        CGPoint sliderCenter = slideToCancel.view.center;
        sliderCenter.y += slideToCancel.view.bounds.size.height;
        slideToCancel.view.center = sliderCenter;

//should I put it here?        
// [self coreDataAction];
    } completion:^(BOOL finished) {
//should I put it here?
    } ];

假设[self coreDataAction]在主线程上执行,我认为您应该将其放在第一行,以确保在动画完成时方法已完成。

更好的处理方法可能是在屏幕上设置视图动画,然后在完成处理程序中启动
coreDataAction
coreDataAction
方法执行完成后,您可以调用一个方法来设置幻灯片动画,以取消屏幕外的查看。

如果
coreDataAction
方法中的任何调用都阻止了调用,则动画将在
coreDataAction
完成执行后才会出现。如果是这种情况,@AlexStone可以使用
performSelector:withObject:afterDelay:
异步启动,但这最多只能在动画排队后启动
coreDataAction
方法的执行。据我所知,他不希望动画在coreDataAction之前完成。如果异步启动,则动画可能会完成,coreDataAction仍在工作。由于动画只有半秒钟,我的想法是他只是在coreDataAction之后启动。关于core data action还有其他问题,因为从后台线程执行这些操作可能会导致需要进行上下文合并(两个线程具有各自的具有不同数据的草稿行)。我还没有准备好做这种活动。我最后把对核心数据的调用放在动画之上。有两个动画-一个是响应用户滑动滑块,这是在启动核心数据操作时。一旦核心数据操作完成,滑块将在屏幕外设置动画,您已经设置了持续时间。如果您不使用基于块的动画(请参见UIView类参考了解区别),请使用该选项。我认为您不应该让用户关心此“操作”是否完成。在后台进行计算,让用户继续做比等待计算机更重要的事情。