自 Xcode 10 以来,UIImageView setImage 在后台线程上崩溃
UIImageView setImage crashes on background thread since Xcode 10
自 Xcode 10 在 iOS,以下内容崩溃:
[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 这是否正常?
您只能从主线程访问 UI 元素。您无法从其他线程访问它。这就是应用程序崩溃的原因。使用下面的代码。
dispatch_async(dispatch_get_main_queue(), ^{
//update your UI stuff here.
});
您可以对 Swift 执行相同的操作,如下所示。
DispatchQueue.main.async { // your UI stuff here }
感谢@lenooh 指出。
自 Xcode 10 在 iOS,以下内容崩溃:
[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 这是否正常?
您只能从主线程访问 UI 元素。您无法从其他线程访问它。这就是应用程序崩溃的原因。使用下面的代码。
dispatch_async(dispatch_get_main_queue(), ^{
//update your UI stuff here.
});
您可以对 Swift 执行相同的操作,如下所示。
DispatchQueue.main.async { // your UI stuff here }
感谢@lenooh 指出。