0

Mon application est de communiquer entre environ 5 iPads et de mettre à jour en fonction des données reçues grâce à la structure de connectivité multipeer.Swift: Multipeer Connectivity + UI Mise à jour

Un des iPad fait ce qui suit: Il obtient son emplacement actuel et l'envoie à d'autres pairs. Les homologues mettent à jour l'interface utilisateur en fonction de l'emplacement reçu.

J'ai trouvé qu'il y avait un problème que lorsque l'iPad a besoin d'envoyer le paquet aux autres, l'interface n'a pas été mise à jour immédiatement. Les événements d'interface utilisateur sont restés bloqués jusqu'à ce qu'il ait fini d'envoyer le paquet. Depuis la mise à jour de l'emplacement, tous ces événements ont tiré en permanence.

j'ai essayé de placer le paquet d'envoi dans un fil:

let bgQueue = DispatchQueue(label: "hk.edu.polyu.isurf.sendqueue", qos: .utility, attributes: .concurrent) 

Et puis mettre le code pour envoyer paquet dans ce bgQueue:

func sendPacket { 
    bgQueue.async { 
    // create packet, and send 
    } 
} 

Mon code d'emplacement de mise à jour provoquera ceci:

func receiveLocation() { 
    sendPacket() 
    updateUI() 
} 

Comment puis-je améliorer l'efficacité? L'interface utilisateur ne peut fondamentalement pas mettre à jour maintenant, il est de "retard" sérieux.

J'ai essayé de changer le type de bgQueue, mais pas d'amélioration.

Merci.

Répondre

0

Vous devez vous assurer que votre interface utilisateur est mise à jour dans la file d'attente principale.

Si vous essayez de mettre à jour l'interface utilisateur dans la fonction didRecieve de la session, cette fonction s'exécute en arrière-plan. Cela signifie que toute modification apportée à l'intérieur de l'interface utilisateur doit être placée à l'intérieur d'un Dispatch dans la file d'attente principale afin que ses mises à jour soient effectuées immédiatement.

DispatchQueue.main.async 
{ 
// UI updates go here 
}