Sobes.tech
Junior

Koje načine prenosa podataka poznaješ?

sobes.tech АИ

Одговор од АИ

  • Svojstva (Properties):
    • Pri inicijalizaciji (injektovanje putem konstruktora).
    • Dodeljivanje nakon inicijalizacije.
    class ViewController: UIViewController {  
        var data: String? // Prenos podataka putem svojstva  
    }  
    
  • Delegati (Delegation):
    • Protokol sa metodama za obaveštavanje o događajima i prenos podataka.
    protocol DataDelegate: AnyObject {  
        func didReceiveData(data: String)  
    }  
    
    class SenderViewController: UIViewController {  
        weak var delegate: DataDelegate?  
    
        func sendData() {  
            delegate?.didReceiveData(data: "Zdravo od Sender")  
        }  
    }  
    
    class ReceiverViewController: UIViewController, DataDelegate {  
        func didReceiveData(data: String) {  
            print("Primljeni podaci: \(data)")  
        }  
    }  
    
  • Zatvaranja (Closures) / Callback-ovi:
    • Prenos funkcije koja će biti pozvana na drugom mestu.
    class SenderViewController: UIViewController {  
        var completionHandler: ((String) -> Void)?  
    
        func sendData() {  
            completionHandler?("Podaci putem zatvaranja")  
        }  
    }  
    
  • NotificationCenter:
    • Mehanizam za objavljivanje i pretplatu za široko emitovana obaveštenja.
    // Pošiljalac  
    NotificationCenter.default.post(name: NSNotification.Name("DataNotification"), object: nil, userInfo: ["data": "Podaci iz obaveštenja"])  
    
    // Primaoc  
    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("Primljeni podaci obaveštenja: \(data)")  
        }  
    }  
    
  • Singleton / Deljena instanca:
    • Jedinstvena instanca klase, dostupna globalno.
    class DataManager {  
        static let shared = DataManager()  
        var sharedData: String?  
        private init() {} // Zabrana kreiranja drugih instanci  
    }  
    
    // Upotreba  
    DataManager.shared.sharedData = "Podaci iz singleton-a"  
    print(DataManager.shared.sharedData)  
    
  • Praćenje vrednosti po ključu (KVO):
    • Mehanizam za praćenje promena svojstava objekata.
    class MyObservableObject: NSObject {  
        @objc dynamic var value: String = "" // Svojstvo mora biti `@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("Vrednost promenjena u: \(newValue)")  
                }  
            }  
        }  
    }  
    
  • Core Data / Realm / Ostale baze podataka:
    • Za trajno skladištenje i razmenu podataka između kontrolera i ekrana.
  • Mediator Pattern:
    • Objekat koji upravlja interakcijom između drugih objekata.
  • Binding sa reaktivnim programiranjem (RxSwift, Combine):
    • Prenos podataka putem tokova (streams) ili izdavača (publishers).
    // Primer sa Combine  
    import Combine  
    
    let publisher = PassthroughSubject<String, Never>()  
    
    // Pretplatnik  
    let subscriber = publisher.sink { receivedValue in  
        print("Primljena vrednost putem Combine: \(receivedValue)")  
    }  
    
    // Pošiljalac  
    publisher.send("Podaci iz Combine")  
    
  • Korisnički podaci (User Defaults):
    • Za čuvanje male količine jednostavnih podataka, dostupnih globalno.
    UserDefaults.standard.set("Korisničko ime", forKey: "userName")  
    let userName = UserDefaults.standard.string(forKey: "userName")  
    
  • Objekti okruženja (Environment Objects) u SwiftUI:
    • Za prenos zavisnosti naniže kroz hijerarhiju prikaza u SwiftUI.
    import SwiftUI  
    
    class AppData: ObservableObject {  
        @Published var message: String = "Početna poruka"  
    }  
    
    struct ContentView: View {  
        @EnvironmentObject var appData: AppData  
    
        var body: some View {  
            Text(appData.message)  
        }  
    }