web-dev-qa-db-ja.com

Xcode 10以降、UIImageViewsetImageがバックグラウンドスレッドでクラッシュする

IOSのXcode10以降、以下がクラッシュします:[Animation] +[UIView setAnimationsEnabled:] being called from a background thread. Performing any operation from a background thread on UIView or a subclass is not supported and may result in unexpected and insidious behavior. trace=...

バックグラウンドスレッドから起動した場合。

+(UIImage *)circularImage:(UIImage *)image withDiameter:(NSUInteger)diameter
{
    CGRect frame = CGRectMake(0.0f, 0.0f, diameter, diameter);
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame];
    imageView.contentMode = UIViewContentModeScaleAspectFill;
    imageView.clipsToBounds = YES;
    [imageView setImage:image]; <--- crashing here
...
}

単純なUIImageをバックグラウンドスレッドのUIImageViewに割り当てることができないのは正常ですか?

3

UI要素には、メインスレッドからのみアクセスできます。他のスレッドからアクセスすることはできません。そのため、アプリがクラッシュします。以下のコードを使用してください。

dispatch_async(dispatch_get_main_queue(), ^{
    //update your UI stuff here.
});

以下のようにSwiftで同じことができます。

DispatchQueue.main.async { // your UI stuff here }

それを指摘してくれた@lenoohに感謝します。

13
Jay Mayu