Sobes.tech
Junior

Ποιους τρόπους μετάδοσης δεδομένων γνωρίζεις;

sobes.tech AI

Απάντηση από AI

  • Ιδιότητες (Properties):
    • Κατά την αρχικοποίηση (εισαγωγή μέσω αρχικοποιητή).
    • Ανάθεση μετά την αρχικοποίηση.
    class ViewController: UIViewController {  
        var data: String? // Μεταβίβαση δεδομένων μέσω ιδιότητας  
    }  
    
  • Αντιπρόσωποι (Delegation):
    • Πρωτόκολλο με μεθόδους για ειδοποιήσεις σχετικά με γεγονότα και μεταφορά δεδομένων.
    protocol DataDelegate: AnyObject {  
        func didReceiveData(data: String)  
    }  
    
    class SenderViewController: UIViewController {  
        weak var delegate: DataDelegate?  
    
        func sendData() {  
            delegate?.didReceiveData(data: "Γειά από τον αποστολέα")  
        }  
    }  
    
    class ReceiverViewController: UIViewController, DataDelegate {  
        func didReceiveData(data: String) {  
            print("Ληφθέντα δεδομένα: \(data)")  
        }  
    }  
    
  • Κλεισίματα (Closures) / Callbacks:
    • Μεταφορά λειτουργίας που θα κληθεί σε άλλο σημείο.
    class SenderViewController: UIViewController {  
        var completionHandler: ((String) -> Void)?  
    
        func sendData() {  
            completionHandler?("Δεδομένα μέσω κλεισίματος")  
        }  
    }  
    
  • NotificationCenter:
    • Μηχανισμός δημοσίευσης και εγγραφής για ευρείας κλίμακας ειδοποιήσεις.
    // Αποστολέας  
    NotificationCenter.default.post(name: NSNotification.Name("DataNotification"), object: nil, userInfo: ["data": "Δεδομένα από την ειδοποίηση"])  
    
    // Παραλήπτης  
    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("Ληφθέντα δεδομένα ειδοποίησης: \(data)")  
        }  
    }  
    
  • Μονάδα / Κοινόχρηστης Περίπτωση:
    • Μόνο ένα αντίγραφο της κλάσης, διαθέσιμο παγκοσμίως.
    class DataManager {  
        static let shared = DataManager()  
        var sharedData: String?  
        private init() {} // Απαγορεύει τη δημιουργία άλλων αντιγράφων  
    }  
    
    // Χρήση  
    DataManager.shared.sharedData = "Δεδομένα από το Singleton"  
    print(DataManager.shared.sharedData)  
    
  • Παρατήρηση τιμών-κλειδιών (KVO):
    • Μηχανισμός για την παρακολούθηση αλλαγών στις ιδιότητες αντικειμένων.
    class MyObservableObject: NSObject {  
        @objc dynamic var value: String = "" // Η ιδιότητα πρέπει να είναι `@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("Τιμή άλλαξε σε: \(newValue)")  
                }  
            }  
        }  
    }  
    
  • Core Data / Realm / Άλλες βάσεις δεδομένων:
    • Για διατηρητική αποθήκευση και ανταλλαγή δεδομένων μεταξύ ελεγκτών και οθονών.
  • Mediator Pattern:
    • Αντικείμενο που διαχειρίζεται την αλληλεπίδραση μεταξύ άλλων αντικειμένων.
  • Binding με Αντιδραστικό Προγραμματισμό (RxSwift, Combine):
    • Μεταφορά δεδομένων μέσω ροών (streams) ή εκδότες (publishers).
    // Παράδειγμα με Combine  
    import Combine  
    
    let publisher = PassthroughSubject<String, Never>()  
    
    // Συνδρομητής  
    let subscriber = publisher.sink { receivedValue in  
        print("Ληφθείσα τιμή μέσω Combine: \(receivedValue)")  
    }  
    
    // Αποστολέας  
    publisher.send("Δεδομένα από το Combine")  
    
  • User Defaults:
    • Για αποθήκευση μικρής ποσότητας απλών δεδομένων, διαθέσιμων παγκοσμίως.
    UserDefaults.standard.set("Όνομα χρήστη", forKey: "userName")  
    let userName = UserDefaults.standard.string(forKey: "userName")  
    
  • Μεταβλητές περιβάλλοντος (Environment Objects) στο SwiftUI:
    • Για μεταφορά εξαρτήσεων προς τα κάτω στην ιεραρχία των προβολών στο SwiftUI.
    import SwiftUI  
    
    class AppData: ObservableObject {  
        @Published var message: String = "Αρχικό μήνυμα"  
    }  
    
    struct ContentView: View {  
        @EnvironmentObject var appData: AppData  
    
        var body: some View {  
            Text(appData.message)  
        }  
    }