在backgroundtask中添加到CALayer时,不会显示UIImage [英] UIImage not displayed when added to CALayer in a backgroundtask
问题描述
在我的viewcontroller中我有:
in my viewcontroller I have:
@IBOutlet var worldmapview: Worldmapview!
var eventLayer:CALayer=CALayer();
和一些功能:
func create_picture_layer(pathtopic:String) -> CALayer {
let bm=getImage(pathtopic,fBitmapsizeSelected: 100)!;
var calayer_for_picture=CALayer();
calayer_for_picture.frame=CGRectMake(100, 100, 100, 100);
calayer_for_picture.contents = bm.CGImage;
return calayer_for_picture;
}
func createCircleShape(x:CGFloat,y:CGFloat, size:CGFloat) -> CAShapeLayer {
var test2:UIBezierPath=UIBezierPath(ovalInRect: CGRectMake(x - size/2, y - size/2, size, size));
var shapelayer:CAShapeLayer=CAShapeLayer();
shapelayer.backgroundColor=UIColor.clearColor().CGColor;
//shapelayer.frame=CGRectMake(0, 0, 300, 300);
shapelayer.fillColor=UIColor.darkGrayColor().CGColor;
shapelayer.path=test2.CGPath;
shapelayer.opaque=true
return shapelayer;
}
func getImage(simagename: String, fBitmapsizeSelected:CGFloat) -> UIImage?{
var sPathToImage:String=AppProperties.sharedInstance.sPicturePath + simagename;
let checkValidation = NSFileManager.defaultManager()
if (!checkValidation.fileExistsAtPath(sPathToImage) || simagename.equals("")){
// Path to unknown image
let sunknownimagename:String = "na/na.jpa";
sPathToImage=AppProperties.sharedInstance.sPicturePath + sunknownimagename;
}
let bm:UIImage=UIImage(contentsOfFile: sPathToImage)!;
var bMapScaled:UIImage;
if(!bm.isEqual(nil)){
let newSize:CGSize=CGSizeMake(fBitmapsizeSelected, fBitmapsizeSelected);
bMapScaled = bm.imageByScalingToSize(newSize,contentMode: UIViewContentMode.ScaleAspectFill)!;
return bMapScaled;
}else{
return nil;
}
}
在我的 viewDidAppear(动画) :Bool)方法
我尝试在worldmapview中显示图像
In my viewDidAppear(animated: Bool) method
I try to show the image in worldmapview
以下代码在没有任何后台任务的情况下正常工作。图像立即显示。
the following code works fine without any background tasks. The image is shown immediately.
// works
let thepicturelayer=create_picture_layer("mypicpath")
eventLayer.addSublayer(thepicturelayer);
worldmapview.layer.addSublayer(eventLayer);
eventLayer.setNeedsDisplay();
并且在主任务中刷新它对我不起作用。图片未显示。一段时间后它会出现,但并非总是如此。
in a background task and refreshing in the main task it doesn't work for me. Picture is not shown. After a while it appears, but not always.
// doesn't work
let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue, {
// geht auch mit Eventlayer
let thepicturelayer=self.create_picture_layer() // This Shape doesn't appear.
let circleshapelayer=self.createCircleShape(200, y: 200, size: 20) // This shape appears immediatelly.
self.eventLayer.addSublayer(thepicturelayer);
self.eventLayer.addSublayer(circleshapelayer);
dispatch_async(dispatch_get_main_queue(),{
//assert(self.eventLayer.sublayers?.count > 0,"no layers in eventLayer !") // just added
self.worldmapview.layer.addSublayer(self.eventLayer);
//assert(self.worldmapview.layer.sublayers!.count > 0,"no layers in worldmapview!" ) // just added
let sublayers=self.eventLayer.sublayers;
if sublayers != nil {
for l in self.eventLayer.sublayers! {
l.setNeedsDisplay()
}
}
//self.updateWorldMapGUI();
self.worldmapview.layer.addSublayer(self.eventLayer);
//thepicturelayer.setNeedsDisplay();
//circleshapelayer.setNeedsDisplay();
self.eventLayer.setNeedsDisplay();
})
})
更新
我使用新的CAShapelayer以相同的方式更新了代码,该方法立即显示。我不明白其中的区别。在后台任务中创建时,图片不会显示。
I updated the code with a new CAShapelayer added the same way, which is displaying immediately. I do not understand the difference. The Picture is not shown, when created in a background task.
UPDATE2
我意识到一些让我感到困惑的事情:
以下代码没有后台任务,如前所述:
I realized something confusing to me additionally: Following Code without background task works as already described:
let thepicturelayer=create_picture_layer()
eventLayer.addSublayer(thepicturelayer);
worldmapview.layer.addSublayer(eventLayer);
eventLayer.setNeedsDisplay();
//thepicturelayer.setNeedsDisplay(); // When adding this, the picture is not shown.
但是激活最后一行,图片不会出现。可能它与它有关?似乎calayer的内容已经消失了?
But activating the last line, the picture doesn't appear. Probably it has something to do with it ? It seems like the content of the calayer is gone ?
推荐答案
据我所知,你正在创建 CALayer
在后台,和也将该图层添加到后台的UI层次结构中。
As I understand it, you are creating CALayer
in the background, and adding that layer to the UI hierarchy in the background as well.
它会不会是否合理地认为所有UI修改都发生在 main
线程中?如果是这样,试试这个:
Would it be reasonable to think that all UI modifications are to happen in the main
thread? If so, try this:
let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue, {
let thepicturelayer=self.create_picture_layer()
dispatch_async(dispatch_get_main_queue(),{
self.eventLayer.addSublayer(thepicturelayer);
assert(self.eventLayer.sublayers) // just added
self.worldmapview.layer.addSublayer(self.eventLayer);
assert(self.worldmapview.layer.sublayers) // just added
self.worldmapview.setNeedsDisplay()
})
})
这篇关于在backgroundtask中添加到CALayer时,不会显示UIImage的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!