在backgroundtask中添加到CALayer时,不会显示UIImage [英] UIImage not displayed when added to CALayer in a backgroundtask

查看:110
本文介绍了在backgroundtask中添加到CALayer时,不会显示UIImage的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆