More on implementation chapter
This commit is contained in:
@@ -65,12 +65,55 @@ struct NoteInvitation: Identifiable {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Ostatnim obiektem jest struktura `Peer`, która jest opisem aktualnego stanu połączenia wykrytego innej instancji systemu w pobliżu użytkownika.
|
Ostatnim obiektem jest struktura `Peer`, która jest opisem aktualnego stanu połączenia wykrytego innej instancji systemu w pobliżu użytkownika. Składa się z wartości enumerowanej opisującej stan połączeniao raz identyfikatorem użytkownika w sieci peer to peer. Implementuja ona protokół `Idenfitiable`, by móc zostać poprawnie użyta do rysowania listy dostępnych klientów w pobliżu użytkownika.
|
||||||
|
|
||||||
|
```swift
|
||||||
|
struct Peer: Identifiable {
|
||||||
|
enum ConnectionState {
|
||||||
|
case available
|
||||||
|
case joined
|
||||||
|
case rejected
|
||||||
|
case invitationPending
|
||||||
|
}
|
||||||
|
|
||||||
|
var id: String { mcPeer.displayName }
|
||||||
|
let mcPeer: MCPeerID
|
||||||
|
var state: ConnectionState
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
== Warstwa sieciowa i komunikacja P2P
|
== Warstwa sieciowa i komunikacja P2P
|
||||||
|
Całość komunikacji między urządzeniami odbywa się z wykorzystaniem frameworka Multipeer Connectivity. Klient twórcy notatki pełni rolę serwera, a pozostali użytkownicy, po uprzednim zaproszeniu, mogą dołączyć do edycji notatki, wysyłać swoje zmiany jak i odbierać zmiany, które dystrybuuje serwer.
|
||||||
|
|
||||||
== Odkrywanie innych urządzeń
|
== Odkrywanie innych urządzeń
|
||||||
|
Obiekt reprezentujący serwer został nazwany `NoteEditingSessionServer`, który dziedziczy właściowści po klasie `NSObject`, która jest uniwersalną implementacją wielu zachowań, które są wymagane od frameworków udostępnianych przez Apple, które zostały napisane w języku Objective-C. Jego konstruktor w przyjmowanych argumentach oczekuje tylko obiektu `OwnPeer`, który będzie wykorzystywany do identyfikacji instancji aplikacji u innych klientów. Sama implementacja konstruktora tworzy nową sesję `MCSession`; obiekt `MCNearbyServiceBrowser`, który odpowiada za wykrywanie pobliskich klientów. Finalnie przypisuje referencję do samego siebie jako parametr `delegate` dla utworzonych `MCSession` i `MCNearbyServiceBrowser`. Pozwala nam to zaimplementować metody, które będą wykorzystywane wewnątrz tych obiektów do komunikacji z innymi użytkownikami. Protokoły delegujące dla wspomnianych obiektów nazywają się odpowiednio `MCSessionDelegate` oraz `MCNearbyServiceBrowserDelegate`. Moja implementacja tych protokołów zostanie przedstawiona w dalszej części pracy.
|
||||||
|
|
||||||
|
```swift
|
||||||
|
init(peer: OwnPeer) {
|
||||||
|
ownPeer = peer
|
||||||
|
browser = .init(peer: peer.peer, serviceType: "peered")
|
||||||
|
session = .init(peer: peer.peer, securityIdentity: nil, encryptionPreference: .required)
|
||||||
|
super.init() // wykonuje pozostałą część
|
||||||
|
browser.delegate = self //
|
||||||
|
session.delegate = self
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
W momencie, gdy autor notatki otworzy ekran edycji, wykonuje się metoda `startServer()`, która wywołuje metodę `startBrowsingForPeers()` obiektu `MCNearbyServiceBrowser`. Opuszczenie ekranu edycji wywołuje metodę `stopServer()`, która wywołuje analogiczną metodę `stopBrowsingForPeers()` oraz zatrzymuje sesję poprzez wywołanie metody `disconnect()` obiektu `MCSession`.
|
||||||
|
|
||||||
|
```swift
|
||||||
|
func startServer() {
|
||||||
|
browser.startBrowsingForPeers()
|
||||||
|
}
|
||||||
|
|
||||||
|
func stopServer() {
|
||||||
|
browser.stopBrowsingForPeers()
|
||||||
|
session.disconnect()
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
== Transportowanie danych
|
== Transportowanie danych
|
||||||
== Algorytm rozwiązywania konfliktów
|
== Algorytm rozwiązywania konfliktów
|
||||||
== Środowisko developerskie i stack technologiczny
|
== Środowisko developerskie i stack technologiczny
|
||||||
|
|||||||
LFS
BIN
Binary file not shown.
Reference in New Issue
Block a user