Finish peer invitation from server side
This commit is contained in:
@@ -112,7 +112,58 @@ func stopServer() {
|
||||
}
|
||||
```
|
||||
|
||||
Obiekt `browser` w momencie wykrycia nowego użytkownika w pobliżu, wywołuje naszą metodę o nazwie `browser`, która przyjmuje wszystkie potrzebne informacje o znalezionym użytkowniku. Implementacja mojego systemu następnie upewnia się czy odkryty użytkownik nie jest jednocześnie autorem notatki, co jest znanym błędem w Multipeer Connectivity, a następnie po udanej weryfikacji dodajemy nowy obiekt dostępnego użytkownika do tablicy na podstawie której jest budowany interfejs z listą dostępnych użytkowników.
|
||||
Obiekt `browser` w momencie wykrycia nowego użytkownika w pobliżu, wywołuje naszą metodę o nazwie `browser()`, która przyjmuje wszystkie potrzebne informacje o znalezionym użytkowniku. Implementacja mojego systemu następnie upewnia się czy odkryty użytkownik nie jest jednocześnie autorem notatki, co jest znanym błędem w Multipeer Connectivity. Następnie po udanej weryfikacji dodajemy nowy obiekt dostępnego użytkownika do tablicy na podstawie której jest budowany interfejs z listą dostępnych użytkowników.
|
||||
|
||||
```swift
|
||||
func browser(
|
||||
_ browser: MCNearbyServiceBrowser,
|
||||
foundPeer peerID: MCPeerID,
|
||||
withDiscoveryInfo info: [String: String]?
|
||||
) {
|
||||
guard !visiblePeers.contains(where: { $0.mcPeer == peerID }) && peerID.displayName != ownPeer.peer.displayName else { return }
|
||||
DispatchQueue.main.async {
|
||||
self.visiblePeers.append(Peer(mcPeer: peerID, state: .available))
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
W sytuacji gdy użytkownik straci połączenie z połączonym klientem, następuje usunięcie jego identyfikatora z listy, poprzez wywołanie metody o takiej samej nazwie, ale z parametrami wskazującymi na scenariusz zgubienia klienta.
|
||||
|
||||
```swift
|
||||
func browser(_ browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) {
|
||||
DispatchQueue.main.async {
|
||||
guard let peerIdx = self.visiblePeers.firstIndex(where: { $0.mcPeer == peerID }) else { return }
|
||||
self.visiblePeers.remove(at: peerIdx)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Każda modyfikacja obiektów klasy w tym wypadku musi zostać wywołana na tym samym wątku, ponieważ Multipeer Connectivity nie gwarantuje, że kod będzie się wykonał zawsze na tym samym wątku. Wybrałem wątek główny, ze względu na bezpośrednie użycie właściwości klasy wewnątrz obiektów odpowiedzialnych za budowę interfejsu użytkownika.
|
||||
|
||||
O stanie połączenia z innymi klientami mój system jest informowany przez wykonanie metody session z parametrami zawierającymi informację o stanie, który jest reprezentowany przez typ enumeracji, obiekt sesji oraz identyfikator klienta, których ten stan połączenia dotyczy. Na podstawie tych argumentów, aplikacja aktualizuje tablicę `visiblePeers`.
|
||||
|
||||
```swift
|
||||
func session(
|
||||
_ session: MCSession,
|
||||
peer peerID: MCPeerID,
|
||||
didChange state: MCSessionState
|
||||
) {
|
||||
DispatchQueue.main.async {
|
||||
guard let idx = self.visiblePeers.firstIndex(where: { $0.mcPeer == peerID }) else { return }
|
||||
switch state {
|
||||
case .connected:
|
||||
self.visiblePeers[idx].state = .joined
|
||||
case .notConnected:
|
||||
let currentState = self.visiblePeers[idx].state
|
||||
if currentState == .invitationPending || currentState == .joined {
|
||||
self.visiblePeers[idx].state = .rejected
|
||||
}
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
== Transportowanie danych
|
||||
== Algorytm rozwiązywania konfliktów
|
||||
|
||||
LFS
BIN
Binary file not shown.
Reference in New Issue
Block a user