data transportation section
This commit is contained in:
@@ -235,9 +235,55 @@ func advertiser(
|
|||||||
|
|
||||||
== Transportowanie danych
|
== Transportowanie danych
|
||||||
|
|
||||||
|
W wysyłanym zaproszeniu wysyłamy w metadanych migawkę notatki zawierającą jej tytuł oraz ostatnio dostępną treść. Migawka jest kodowana w formacie JSON bazując na strukturze `NoteContent`. Przykładowym poprawnym zapisem JSON tej struktury jest poniższy przykład
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"title": "My new note",
|
||||||
|
"noteSnapshot": "Lorem Ipsum."
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Po stronie klienta, każda zmiana jest ogłaszana serwerowi poprzez wywołanie metody `send()` obiektu `NoteEditingSessionClient`, która przyjmuje identyfikator użytkownika do które ma wiadomość trafić oraz całą zawartość notatki. Jej implementacja zamienia notatkę wraz z identyfikatorem w typ `NoteMessage`, następnie koduje ją do formatu JSON, finalnie próbuje ją wysłać do określonego użytkownika.
|
||||||
|
|
||||||
|
```swift
|
||||||
|
func send(note: String, to peer: MCPeerID) {
|
||||||
|
let message = NoteMessage(senderID: ownPeer.displayName, content: note)
|
||||||
|
guard let data = try? JSONEncoder().encode(message) else { return }
|
||||||
|
try? session.send(data, toPeers: [peer], with: .reliable)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Przykładowy zapis instancji obiektu `NoteMessage` wygląda następująco:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"senderID": "User2",
|
||||||
|
"content": "Lorem Ipsum Test"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Po tym jak serwer odbierze wysłaną wiadomość, wywoływana jest metoda `session`, która w argumentach przekazuje zakodowane dane, sesję serwera oraz identyfikator użytkownika, który wysłał załączone dane. Po udanym zdekodowaniu danych, wybieramy wszystkich użytkowników, którzy dołączyli do sesji edycji notatki i wysyłamy do nich kopię otrzymanej wiadomości, a serwer dodatkowo wysyła identyczną kopię do warstwy prezentacji.
|
||||||
|
|
||||||
|
```swift
|
||||||
|
func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
|
||||||
|
guard let message = try? JSONDecoder().decode(NoteMessage.self, from: data) else { return }
|
||||||
|
|
||||||
|
let otherPeers = session.connectedPeers.filter { $0 != peerID }
|
||||||
|
if !otherPeers.isEmpty {
|
||||||
|
try? session.send(data, toPeers: otherPeers, with: .reliable)
|
||||||
|
}
|
||||||
|
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
self.noteChangesEmitter.send(message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
== Algorytm rozwiązywania konfliktów
|
== Algorytm rozwiązywania konfliktów
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
== Środowisko developerskie i stack technologiczny
|
== Środowisko developerskie i stack technologiczny
|
||||||
== Implementacja logiki P2P
|
== Implementacja logiki P2P
|
||||||
== Interfejs użytkownika
|
== Interfejs użytkownika
|
||||||
|
|||||||
LFS
BIN
Binary file not shown.
Reference in New Issue
Block a user