Qual è l'approccio migliore per implementare l'integrazione delle dipendenze usando MVVM Architecture?

1

Devo usare DispatchQueue all'interno del controller e passarlo come dipendenza. Questo è quello che ho provato fino ad ora e ho elaborato due soluzioni. Hai bisogno di chiedere cosa sia meglio e di uso comune da parte di altri sviluppatori:

protocol DispatchQueuerable: class {
    func perform(withDelay delay: Double, block: @escaping () -> Void)
    func performAsync(block: @escaping () -> Void)
}

Prima soluzione:

class DispatchQueuer: DispatchQueuerable {
    private let queue: DispatchQueue
    init(queue: DispatchQueue) {
        self.queue = queue
    }
    func perform(withDelay delay: Double, block: @escaping () -> Void) {
        queue.asyncAfter(deadline: .now() + delay as DispatchTime, execute: block)
    }
    func performAsync(block: @escaping () -> Void) {
        queue.async {
            block()
        }
    }
}

Seconda soluzione:

extension DispatchQueue: DispatchQueuerable {
    func perform(withDelay delay: Double, block: @escaping () -> Void) {
        asyncAfter(deadline: .now() + delay as DispatchTime, execute: block)
    }
    func performAsync(block: @escaping () -> Void) {
        async {
            block()
        }
    }
}

La mia domanda è: approccio migliore per evitare l'accoppiamento stretto nel codice e utilizzare correttamente MVVM Archtecture:

Come li uso?

Prima soluzione:

let queuer = DispatchQueuer(queue: DispatchQueue.main)
MyViewController(queuer: queuer)

class MyViewController: UIViewController {
    private let queuer: DispatchQueuer
    init(queuer: DispatchQueuer) {
        self.queuer = queuer
    }
}

Seconda soluzione:

let queue = DispatchQueue.main
MyViewController(queue: queue)

class MyViewController: UIViewController {
    private let queue: DispatchQueue
    init(queue: DispatchQueue) {
        self.queue = queue
    }
}

Mi piace davvero la PRIMA soluzione e la conosco, ma cosa ne pensi?

    
posta Bartłomiej Semańczyk 19.12.2018 - 10:41
fonte

2 risposte

1

Prima di venire alla tua domanda attuale vorrei dire che la differenza tra le tue due soluzioni non è stata facile da scoprire per me, iniziando a considerare come utilizzare la tua classe MyViewController . Poi ho capito che stai usando due classi con nomi molto simili. Dal mio punto di vista il nome della tua classe DispatchQueuer è molto vicino a DispatchQueue . Dovresti assolutamente trovare un altro nome per questo.

Per quanto riguarda la tua domanda sull'accoppiamento delle tue soluzioni, direi che dipende. Le dipendenze del tempo di compilazione sono uguali. Tuttavia, la dipendenza funzionale dal protocollo DispatchQueuerable è più ovvia per l'utente della classe MyViewController nella prima soluzione. Contrariamente a ciò, la seconda soluzione che utilizza l'estensione introduce in qualche modo una dipendenza nascosta dal protocollo (a seconda di dove si inserisce il codice sorgente dell'estensione). Ancora questa soluzione è il modo più snello per farlo e uno sviluppatore esperto di Swift probabilmente preferirà questa soluzione, mentre qualsiasi sviluppatore di OO sarà in grado di seguire facilmente la tua prima soluzione.

    
risposta data 19.12.2018 - 11:55
fonte
1

Sicuramente optate per quest'ultimo. Uno dei maggiori punti di forza di Swift è il supporto per la modellazione retroattiva. Approfittane.

In Swift, in pratica non devi mai utilizzare il modello di progettazione del wrapper, perché puoi semplicemente rendere i tipi esistenti conformi ai nuovi protocolli.

    
risposta data 20.12.2018 - 04:16
fonte