Sobes.tech
Junior

Jakie metody przesyłania danych znasz?

sobes.tech AI

Odpowiedź od AI

  • Właściwości:
    • Podczas inicjalizacji (wstrzykiwanie przez inicjator).
    • Przypisanie po inicjalizacji.
    class ViewController: UIViewController {  
        var data: String? // Przesyłanie danych przez właściwość  
    }  
    
  • Delegaty:
    • Protokół z metodami do powiadamiania o zdarzeniach i przesyłania danych.
    protocol DataDelegate: AnyObject {  
        func didReceiveData(data: String)  
    }  
    
    class SenderViewController: UIViewController {  
        weak var delegate: DataDelegate?  
    
        func sendData() {  
            delegate?.didReceiveData(data: "Wiadomość od nadawcy")  
        }  
    }  
    
    class ReceiverViewController: UIViewController, DataDelegate {  
        func didReceiveData(data: String) {  
            print("Odebrane dane: \(data)")  
        }  
    }  
    
  • Zamykanie (Closures) / Wywołania zwrotne (Callbacks):
    • Przesyłanie funkcji, która zostanie wywołana gdzie indziej.
    class SenderViewController: UIViewController {  
        var completionHandler: ((String) -> Void)?  
    
        func sendData() {  
            completionHandler?("Dane przez zamknięcie")  
        }  
    }  
    
  • NotificationCenter:
    • Mechanizm publikacji i subskrypcji dla powiadomień szerokiego zasięgu.
    // Nadawca  
    NotificationCenter.default.post(name: NSNotification.Name("DataNotification"), object: nil, userInfo: ["data": "Dane z powiadomienia"])  
    
    // Odbiorca  
    NotificationCenter.default.addObserver(self, selector: #selector(didReceiveNotification(_:)), name: NSNotification.Name("DataNotification"), object: nil)  
    
    @objc func didReceiveNotification(_ notification: Notification) {  
        if let data = notification.userInfo?["data"] as? String {  
            print("Odebrane dane powiadomienia: \(data)")  
        }  
    }  
    
  • Singleton / Wspólna instancja:
    • Jedyna instancja klasy, dostępna globalnie.
    class DataManager {  
        static let shared = DataManager()  
        var sharedData: String?  
        private init() {} // Zabrania tworzenia innych instancji  
    }  
    
    // Użycie  
    DataManager.shared.sharedData = "Dane z Singleton"  
    print(DataManager.shared.sharedData)  
    
  • Obserwacja klucz-wartość (KVO):
    • Mechanizm do obserwowania zmian właściwości obiektów.
    class MyObservableObject: NSObject {  
        @objc dynamic var value: String = "" // Właściwość musi być `@objc dynamic`  
    }  
    
    class Observer: NSObject {  
        var observation: NSKeyValueObservation?  
    
        func startObserving(object: MyObservableObject) {  
            observation = object.observe(\.value, options: [.new]) { observedObject, change in  
                if let newValue = change.newValue {  
                    print("Wartość zmieniona na: \(newValue)")  
                }  
            }  
        }  
    }  
    
  • Core Data / Realm / Inne bazy danych:
    • Do trwałego przechowywania i wymiany danych między kontrolerami i ekranami.
  • Wzorzec Mediator:
    • Obiekt zarządzający interakcją między innymi obiektami.
  • Binding z Programowaniem Reaktywnym (RxSwift, Combine):
    • Przesyłanie danych przez strumienie (streams) lub wydawców (publishers).
    // Przykład z Combine  
    import Combine  
    
    let publisher = PassthroughSubject<String, Never>()  
    
    // Subskrybent  
    let subscriber = publisher.sink { receivedValue in  
        print("Odebrana wartość przez Combine: \(receivedValue)")  
    }  
    
    // Nadawca  
    publisher.send("Dane z Combine")  
    
  • Ustawienia użytkownika (User Defaults):
    • Do zapisywania małych, prostych danych, dostępnych globalnie.
    UserDefaults.standard.set("Nazwa użytkownika", forKey: "userName")  
    let userName = UserDefaults.standard.string(forKey: "userName")  
    
  • Zmienne środowiskowe (Environment Objects) w SwiftUI:
    • Do przekazywania zależności w dół hierarchii widoków w SwiftUI.
    import SwiftUI  
    
    class AppData: ObservableObject {  
        @Published var message: String = "Wstępne wiadomości"  
    }  
    
    struct ContentView: View {  
        @EnvironmentObject var appData: AppData  
    
        var body: some View {  
            Text(appData.message)  
        }  
    }