2015-11-26 2 views
5

в моем ViewController у меня есть:UIImage не отображается при добавлении к CALayer в backgroundtask

@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(animated: Bool) method я пытаюсь показать изображение в worldmapview

следующий код отлично работает без каких-либо фоновых задач. Изображение отображается немедленно.

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

в фоновом задании и освежении в главной задаче, это не работает для меня. Изображение не отображается. Через некоторое время появляется, но не всегда.

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

      }) 
     }) 

Update

Я обновил код с новым CAShapelayer добавил тот же самый путь, который сразу же отображающее. Я не понимаю разницы. Изображение не отображается при создании в фоновом задании.

UPDATE2

я понял, что-то запутанную мне дополнительно: После кода без фоновой задачи работы, как уже было описано:

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

Но активации последней строки, картинка не отображается. Наверное, это как-то связано с этим? Похоже, что содержание жалобы пропало?

+0

Можете ли вы подтвердить, что 'self.create_picture_layer ("mypicpath")' является синхронным, и не возвращается сразу? – SwiftArchitect

+0

Вы правы. Я обновил код. Я написал «его пустой», и он столкнулся с этой ситуацией. Есть ли у вас какие-либо намеки, как это решить? Я хотел бы подготовить слой в фоновом режиме и обновить последующие слова, когда будет добавлен слой. Как это сделать ? –

+0

Вы не должны изменять интерфейс в фоновом потоке. – kelin

ответ

1

Как я понимаю, вы создаете CALayer в фоновом режиме, и добавляете этот слой к иерархии пользовательского интерфейса в фоновом режиме.

Было бы разумным думать, что все модификации пользовательского интерфейса должны произойти в потоке main? Если это так, попробуйте это:

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

Спасибо за помощь, но это не сработало. Я обновил свой код. Там мы видим, что моя новая добавленная циркулярная лента появляется сразу же, но в картинах нет. Вопрос в том, почему? –

+0

Что стоит за 'getImage'? Вы пытались с изображением, присутствующим в каталоге активов? – SwiftArchitect

+0

Я только что обновил вопрос с кодом getImage(). Я не пытался использовать каталог ресурсов. Это также будет невозможно в моей ситуации, потому что я не знаю, какие фотографии есть. Они находятся в определенной папке на устройстве. –

Смежные вопросы