仅在第一次exectuation上表现缓慢

时间:2014-03-21 07:25:51

标签: ios performance

我设置了一个基本计时器,用于记录完成自定义动画所需的时间。

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

感谢任何想法...

2 个答案:

答案 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;
    });
});
}