CAShapeLayer路径动画延迟严重

CAShapeLayer path animation has serious delay

我正在尝试创建一个在我的应用发出网络请求时绘制一个圆圈的加载屏幕。圆圈的数量表示请求与完成的接近程度。然而,网络请求和动画之间存在严重的延迟(~8 秒)。经过大量搜索后,我还没有找到任何人遇到过这个问题,所以我非常绝望。

我现在的设置是,NSProgress 对象将在发出请求时更新,并将触发一个 KVO 通知,其中包含 userInfo 中的 NSProgress 对象。这与发现 here.

的方法相同
#Client.m
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if ([keyPath isEqualToString:@"fractionCompleted"] && [object isKindOfClass:[NSProgress class]]) {
        NSProgress *progress = (NSProgress *)object;
        NSDictionary *userInfo = @{@"progress":progress};
        [[NSNotificationCenter defaultCenter] postNotificationName:@"FractionCompleted" object:self userInfo:userInfo];
    }
}

然后正在侦听通知的视图控制器将使用它接收到的 NSProgress 对象的 fractionCompleted 更新 LoadingProgressView。

#MainViewController.m
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateProgress:) name:@"FractionCompleted" object:nil];
...
...
- (void)updateProgress:(NSNotification*)note {
    NSProgress* prog = note.userInfo[@"progress"];
    [self.progressIndicatorView updateProgress:(CGFloat)prog.fractionCompleted];
}

现在在 LoadingProgressView 中,CAShapeLayer 的 strokeEnd 属性 被设置为 fractionCompleted 值。我正在使用 here.

教程中的相同想法
#LoadingProgressView.m
- (void)updateProgress:(CGFloat)frac {
    _circlePathLayer.strokeEnd = frac;
}

当我实际提出请求时,直到请求完成后大约 5 秒才发生任何事情。到那时,整个圆圈立即动画化。

我完全不知道为什么会这样,这让我发疯。我可以使用调试器清楚地看到 strokeEnd 属性 正在实时更新,但 LoadingProgressView 直到很久以后才拒绝重新渲染。很感谢任何形式的帮助。谢谢。

编辑:好的,所以临时解决方案是分叉一个延迟为 0 的新线程来更新每个通知的进度视图。然而,这似乎是糟糕的线程管理,因为我可能会创建一百多个不同的线程来完成相同的任务。我想知道还有什么我可以做的。

- (void)updateProgress:(NSNotification*)note {
    NSProgress* prog = note.userInfo[@"progress"];
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self.progressIndicatorView updateProgress:(CGFloat)prog.fractionCompleted];
    });
}

我运行遇到了同样的问题。这似乎是由后台线程设置路径引起的。确保这发生在主线程上解决了这个问题。现在立即更新形状绘制。