UIImage no se muestra cuando se agrega a CALayer en un backgroundtask

en mi viewcontroller tengo:

@IBOutlet var worldmapview: Worldmapview! var eventLayer:CALayer=CALayer(); 

y alguna function:

 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(simageame: String, fBitmapsizeSelected:CGFloat) -> UIImage?{ var sPathToImage:String=AppProperties.shanetworkingInstance.sPicturePath + simageame; let checkValidation = NSFileManager.defaultManager() if (!checkValidation.fileExistsAtPath(sPathToImage) || simageame.equals("")){ // Path to unknown image let sunknownimageame:String = "na/na.jpa"; sPathToImage=AppProperties.shanetworkingInstance.sPicturePath + sunknownimageame; } 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; } } 

En mi viewDidAppear(animated: Bool) method bash mostrar la image en worldmapview

el siguiente código funciona bien sin tareas de background. La image se muestra de inmediato.

 // works let thepicturelayer=create_picture_layer("mypicpath") eventLayer.addSublayer(thepicturelayer); worldmapview.layer.addSublayer(eventLayer); eventLayer.setNeedsDisplay(); 

en una tarea de background y actualizar en la tarea principal, no funciona para mí. La image no se muestra. Después de un time aparece, pero no siempre.

 // 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(); }) }) 

Actualizar

Actualicé el código con un CAShapelayer nuevo agregado de la misma manera, que se muestra de inmediato. No entiendo la diferencia. La image no se muestra cuando se crea en una tarea de background.

UPDATE2

Me di count de algo que también me confundía: el código siguiente sin tarea de background funciona como ya se ha descrito:

  let thepicturelayer=create_picture_layer() eventLayer.addSublayer(thepicturelayer); worldmapview.layer.addSublayer(eventLayer); eventLayer.setNeedsDisplay(); //thepicturelayer.setNeedsDisplay(); // When adding this, the picture is not shown. 

Pero al activar la última línea, la image no aparece. ¿Probablemente tenga algo que ver con eso? ¿Parece que el contenido del calayer se ha ido?

Según lo entiendo, está creando CALayer en segundo plano y agregando esa capa a la jerarquía de la interfaz de usuario en segundo plano.

¿Sería razonable pensar que todas las modificaciones de la interfaz de usuario ocurren en el hilo main ? Si es así, testing esto:

 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() }) })