Conflict resolution algorithm, developer environment and tech stack
This commit is contained in:
@@ -282,10 +282,28 @@ func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPee
|
|||||||
|
|
||||||
== Algorytm rozwiązywania konfliktów
|
== Algorytm rozwiązywania konfliktów
|
||||||
|
|
||||||
|
Rozwiązywanie konfliktów jest dokonywane na podstawie strategii Last Writer Wins, gdzie ostatnio otrzymana wiadomość nadpisuje zawartość pozostałych kopii. W przypadku nanoszenia zmian na interfejs użytkownika, wykorzystałem natywną obsługę zmiany tekstu przez systemowy kompoent `TextEditor`, który w większości wypadków potrafi sobie poradzić czy prostych podmianach zawartości tekstu.
|
||||||
|
|
||||||
|
Zrezygnowałem z implementacji struktur danych CRDT ze względu na bardzo wysoki koszt implementacji, ponieważ oprócz samych struktur, musiałbym napisać własną implementację obsługi podmiany tekstu i aktualizacji kursora w edytorze tekstowym, co znacznie wykracza poza zakres tej pracy.
|
||||||
|
|
||||||
== Środowisko developerskie i stack technologiczny
|
== Środowisko developerskie i stack technologiczny
|
||||||
== Implementacja logiki P2P
|
|
||||||
|
Uruchomienie projektu wymaga posiadania komputera Macintosh z systemem operacyjnym macOS w wersji 26.0 (Tahoe) oraz środowisko programistyczne Xcode w wersji 26.0. Do uruchomienia aplikacji potrzebne jest założenie konta Apple ID i zaakceptowania warunków użytkowania konta deweloperskiego, dzięki któremu można wygenerować certyfikat, którego potrzebuje Xcode do zbudowania aplikacji.
|
||||||
|
|
||||||
|
Aplikacja wykorzystuje framework SwiftUI do budowania warstwy prezentacji. Jest to deklaratywny, wieloplatformowy framework między innymi dostarczający mechanizmy, które zostały wykorzystane w ramach tej pracy:
|
||||||
|
- automatycznego odświeżania interfejsu na podstawie nasłuchiwania na zmiany modelów danych
|
||||||
|
- automatycznego zapisu prymitywnych danych na dysku
|
||||||
|
- wstrzykiwania zależności wgłąb hierarchii interfejsu
|
||||||
|
- zaawansowanych wzorców stosowanych w tworzeniu dobrych doświadczeń użytkownika - np. wysuwalne panele (bottom sheets).
|
||||||
|
|
||||||
|
Kluczowym frameworkiem w budowaniu tej aplikacji jest Multipeer Connectivity, który zapewniał ułatwioną konfigurację całej komunikacji między pobliskimi użytkownikami. Pomocniczymi bibliotekami są `Foundation` oraz `Combine`.
|
||||||
|
|
||||||
|
`Foundation` daje dostęp do złożonych, ale bardzo często wykorzystywanych typów i funkcji w Swifcie - `URL`, `FileManager`, `JSONDecoder`, `JSONEncoder`.
|
||||||
|
|
||||||
|
`Combine` jest biblioteką dodającą programowanie reaktywne do Swifta, ale również jako pierwsza zapewniła mechanizmy komunikowania zmian w modelach danych do widoków implementowanych w SwiftUI. Moja praca wykorzystywała przede wszystkim obiekty `PassthroughSubjects`, które służyły za obiekty emitujące każde nowo otrzymane dane od innych użytkowników.
|
||||||
|
|
||||||
== Interfejs użytkownika
|
== Interfejs użytkownika
|
||||||
|
|
||||||
|
|
||||||
== Napotkane wyzwania implementacyjne i rozwiązania
|
== Napotkane wyzwania implementacyjne i rozwiązania
|
||||||
== Ograniczenia środowisk iOS/macOS
|
== Ograniczenia środowisk iOS/macOS
|
||||||
|
|||||||
LFS
BIN
Binary file not shown.
Reference in New Issue
Block a user