我设置了一个基本计时器,用于记录完成自定义动画所需的时间。
- (void) performAnimationOfFrameAtIndex:(NSNumber*)indexNum
{
int index = indexNum.intValue;
BOOL completedSequece = index >= [self.frames count];
if (completedSequece) {
BOOL repeatsRemaining = self.currentCycleCount < self.cyclesRepeatsValue;
if (repeatsRemaining) {
self.currentCycleCount ++;
index = kFirstFrame;
}
else {
self.methodEnd = [NSDate date];
[self logDurationToComplete];
return;
}
}
UIImageView *imgIn;
UIImageView *imgOut;
if (index % 2 == 0) {
imgIn = self.animationImageViewOne;
imgOut = self.animationImageViewTwo;
}
else {
imgIn = self.animationImageViewTwo;
imgOut = self.animationImageViewOne;
}
imgIn.image = self.frames[index];
[self.view sendSubviewToBack:self.imgOut];
double speed = (index < self.frames.count * 0.5) ? self.inspirationDuration : self.expirationDuration;
[self performSelector:@selector(performAnimationOfFrameAtIndex:) withObject:[NSNumber numberWithInt:index + 1] afterDelay:speed];
}
我已将其设置为1.0秒
为什么第一次执行1.2 - &gt; 1.6秒,以下需要1.0秒。
如果将其设置为2秒,则第一次运行需要2.2 - &gt; 2.6秒......
如果设置为3秒,首次运行需要3.0秒,所以
Time Profiler表示
imgIn.image = self.frames [index];
正在消耗100%的时间,我尝试将imgIn.image设置为属性并在viewDidLoad中设置,但第一次运行延迟没有变化。
所有图片都已在viewDidLoad中预加载。
模拟器或设备没有区别,方法调用开始使用IBAction
感谢任何想法...
答案 0 :(得分:0)
[self performSelector: withObject: afterDelay:]
考虑您已将延迟值定为1秒。上述函数使用延迟激活事件的概念,这意味着在1秒后将对此函数的调用添加到执行runLoop( Queue )。当它被添加到runLoop( Queue )时,可能有机会(根据您的代码)队列中可能已经有一些其他函数调用。只有当队列项从前面移除并且当前前面的函数是你的函数时,它才有机会执行。
当您第一次执行某个操作时,可能某些功能已添加到队列中,因此您可能会延迟执行此功能。
答案 1 :(得分:0)
经过一段时间的思考和研究后,我遇到了这个不错的bit of info
我将此添加到我的viewDidLoad中,问题解决了。
- (void) preloadImages
{
dispatch_queue_t downloadQueue = dispatch_queue_create("imagePreLoader", NULL);
dispatch_async(downloadQueue, ^{
for (int i = 0; i < kNumberBreathingImages; i++) {
UIImage * img = [self.frames objectAtIndex:i];
CGImageRef ref = img.CGImage;
size_t width = CGImageGetWidth(ref);
size_t height = CGImageGetHeight(ref);
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, width * 4, space, kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedFirst);
CGColorSpaceRelease(space);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), ref);
CGContextRelease(context);
}
dispatch_async(dispatch_get_main_queue(), ^{
self.breathButton.enabled = YES;
});
});
}