2016-03-15 1 views
0

Ma question tldr est:Mise à jour UIImageView ne dessin qu'après les événements tactiles

Pourquoi ma UIImageView met uniquement à jour son image en cours d'élaboration à partir de petites touches plutôt que revieving points tirer d'une session multipeer-connectivité?

Actuellement, mon application fonctionne comme suit:

Un utilisateur appuie sur l'écran, si l'utilisateur est connecté à un poste en utilisant MultipeerConnectivity les pairs devraient voir ce que l'autre utilisateur a tiré apparaissent sur leur propre écran. La fonction drawLine utilise CGContextStrokePath() pour tracer une ligne:

drawLine(fromPoint: CGPoint,toPont: CGPoint){ 
    UIGraphicsBeginImageContext(self.view.frame.size); 

    //... do the drawing of the line 

    let image = UIGraphicsGetImageFromCurrentImageContext(); 
    canvas.image = image; 
    UIGraphicsEndImageContext() 
} 

la méthode de drawLine est appelée à partir de deux sources différentes, que ce soit dans les procédés de remplacement touchesMoved() ou touchesEnded() ou dans le procédé suivant qui prend en charge la réception données (deux Points Cg à tracer une ligne entre les deux) à partir d'une session multipeer connectivité:

func handleMPCReceivedDataWithNotification(notification : NSNotification){ 
    let receivedDataDictionary = notification.object as! Dictionary<String, AnyObject> 
    let data = receivedDataDictionary["data"] as? NSData 

    let dataDictionary = NSKeyedUnarchiver.unarchiveObjectWithData(data!) as! Dictionary<String, AnyObject> 

    if let pointData = dataDictionary["points"] as! Dictionary<String,AnyObject>!{ 
     let fromPointObj = pointData["fromPoint"] as! NSValue! 
     let toPointObj = pointData["toPoint"] as! NSValue 
     let toPoint = toPointObj.CGPointValue() 
     let fromPoint = fromPointObj.CGPointValue() 

     drawLineFrom(fromPoint, toPoint: toPoint) 
    } 
} 

Mon problème est que lorsque je tracer une ligne sur un dispositif, il tire bien au niveau local, et le procédé de drawLine est appelé le autre périphérique (comme je peux le voir à partir de pauses et d'impressions), mais l'autre appareil ne sera pas réellement mettre à jour l'image de la toile jusqu'à ce que l'appareil est dessiné n par son propre utilisateur (c.-à-d. un événement tactile se produit). Alors, est-ce que mon canvas UIImageView ne se met pas à jour jusqu'à ce qu'un TouchEvent soit appelé? J'ai essayé de trouver un moyen de le forcer à mettre à jour (par exemple quand j'appelle canvas.image = image je pensais que cela se mettrait à jour automatiquement), mais je n'ai pas été capable de résoudre ce problème.

Quoi qu'il en soit, des suggestions ou des commentaires sont grandement appréciés

William

+0

Ceci est juste une supposition, mais puisque vous êtes mise à jour de l'interface utilisateur, il devra être fait sur le thread principal (par exemple, en utilisant 'dispatch_async'.). – Michael

+0

Ouais, c'était ça! Merci Michael – user3846153

Répondre

0

À première vue, je pense que le problème est que votre code graphique doit être exécuté sur le thread principal. Le dessin provoqué par les événements tactiles est définitivement sur le thread principal, mais il semble que la fonction handleMPC... soit appelée sur un thread d'arrière-plan. Mettez l'invocation drawLineFrom dans ceci:

dispatch_async(dispatch_get_main_thread(), { drawLineFrom(fromPoint, toPoint: toPoint) })

+0

Drewf, Merci! C'était ça! – user3846153