Applicationem ad SwiftUI. Pars I: Dataflow et Redux

Applicationem ad SwiftUI. Pars I: Dataflow et Redux

Postquam publica sessionis Unionis in WWDC 2019 interfuit, in SwiftUI altam divenam accipere decrevi. Multum temporis cum illa operando consumpsi et iam incepi ut veram applicationem evolvere, quae amplis usoribus utilis esse possit.

Appellavi eam MovieSwiftUI - hoc est instrumentum ad quaerendas novas et antiquas membranas, necnon eas in collectione utendo colligendo. TMDB API. Semper amavi membranam atque etiam societatem in hoc campo laborantem creavi, quamquam iam olim. In vix dolor dicta frigus, at usu erat!

admonemus; omnibus legentibus "Habr" - discount 10 rublorum cum scribendo in quavis Skillbox utens "Habr" codice promotivo.

Skillbox commendat: Educational online course "Professio Java Developer".

Quid igitur potest MovieSwiftUI facere?

  • Interacts cum API - quaelibet fere moderna applicatio hoc facit.
  • Loads asynchronous data on requests and parses JSON in Celerem exemplar utens Codable.
  • Imagines ostendit onustas petitorum et thesauros earum.
  • Haec app iOS, iPadOS, et macOS optimam UX praebet pro utentibus harum OSesuum.
  • Usor datas generare potest et suas cinematographicas cinematographicas creare. Applicationem salvat et reddit user notitia.
  • Sententiae, componentes et exempla utentes Redux exemplaris diserte separantur. Data hic fluunt unidirectionalia. Plene potest conditivo, restituto et overscripto.
  • Applicatio praecipuarum partium utitur SwiftUI, TabbedView, SegmentedControl, NavigationView, Forma, Modal, etc. Morem quoque praebet opiniones, gestus, III/UX.

Applicationem ad SwiftUI. Pars I: Dataflow et Redux
Revera, animatio levis est, GIF parum jerky evasit

Operatio in app mihi multum experientiae dedit et altiore experientia positiva erat. Applicationem plene functionis scribere potui, mense Septembri eam emendare et publicare in AppStore simul cum emissione iOS XIII.

Redux, BindableObject et EnvironmentObject

Applicationem ad SwiftUI. Pars I: Dataflow et Redux

Cum Redux iam duos circiter annos laboravi, ita relative bene calleo. Praesertim uti in frontend pugnat interretiales, necnon ad explicandum iOS (Swift) et Android (Kotlin) applicationes.

Numquam paenitet me eligens Redux sicut notitia fluunt architecturae ad faciendum applicationem SwiftUI. Partes acerrimae cum Redux in UIKit app utentes laborant cum copia et acquirendo et retractatione data et destinata ad sententias/componentes. Ad hoc faciendum, connexiones quaedam bibliothecae (utendo ReSwift et ReKotlin). Bene operatur, sed multum in codice. Dolendum est, non apertum fontem.

Nuntiae bonae! Sola cum SwiftUI solliciti sunt - si Redux uti cogitas - sunt commeatus, civitates et reductores. Commercium cum copia apud SwiftUI gratias @EnvironmentObject omnino curatum est. Sic incipit a BindableObject copia.

Simplex celeri sarcina creavi; SwiftUIFluxqui Redux fundamentalem consuetudinem praebet. In mea causa pars est MovieSwiftUI. ego quoque scripsit GRADATUS consequatquae adiuvabit hac componente uteris.

Quid opus est?

final public class Store<State: FluxState>: BindableObject {
    public let willChange = PassthroughSubject<Void, Never>()
        
    private(set) public var state: State
    
    private func _dispatch(action: Action) {
        willChange.send()
        state = reducer(state, action)
    }
}

Quotienscumque felis actionem, gearbox strenue. Actiones aestimabit secundum statum hodiernum applicationis. Tunc novum statum modificatum reddet secundum genus actionis et notitiae.

Bene, cum promptuarium sit BindableObjectum, SwiftUI certiorem faciet, cum eius valor mutatur utens possessionem mutandi a PassthroughSubjectis. Causa BindableObjecti editoritypi praebere debet, sed exsecutio protocollo administrandi responsabilis est. Super, hoc instrumentum potentissimum de Apple. Itaque in proximo cyclo reddendo, SwiftUI adiuvabit corpus sententiarum secundum statum mutationis reddet.

Profecto hoc totum cor et magia SwiftUI. Quoquo modo autem statui subscribit, sententia reddetur secundum id quod ex re publica accipitur, et quod mutatum est.

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
 
    var window: UIWindow?
 
 
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            
            let controller = UIHostingController(rootView: HomeView().environmentObject(store))
            window.rootViewController = controller
            self.window = window
            window.makeKeyAndVisible()
        }
    }
}
 
struct CustomListCoverRow : View {
    @EnvironmentObject var store: Store<AppState>
    
    let movieId: Int
    var movie: Movie! {
        return store.state.moviesState.movies[movieId]
    }
    
    var body: some View {
        HStack(alignment: .center, spacing: 0) {
            Image(movie.poster)
        }.listRowInsets(EdgeInsets())
    }
}

Copia infunditur tamquam EnvironmentObjectum cum applicatio incipit et tunc pervium est quacunque ratione utens @EnvironmentObject. Nulla poena perficiendi est, quia proprietates derivatae cito recuperantur vel computantur ab applicatione civitatis.

Codex supra imaginem mutat si poster cinematographicum mutat.

Quod quidem fit cum una tantum linea, cuius ope sententiae coniunctae sunt civitatis. Si functus est ReSwift in iOS vel etiam connect with React, scies magicam SwiftUI.

Nunc experiri potes ut actionem activate ac novam ede statum. Hic exemplum implicatius est.

struct CustomListDetail : View {
    @EnvironmentObject var store: Store<AppState>
 
    let listId: Int
    
    var list: CustomList {
        store.state.moviesState.customLists[listId]!
    }
    
    var movies: [Int] {
        list.movies.sortedMoviesIds(by: .byReleaseDate, state: store.state)
    }
    
    var body: some View {
        List {
            ForEach(movies) { movie in
                NavigationLink(destination: MovieDetail(movieId: movie).environmentObject(self.store)) {
                    MovieRow(movieId: movie, displayListImage: false)
                }
            }.onDelete { (index) in
               self.store.dispatch(action: MoviesActions.RemoveMovieFromCustomList(list: self.listId, movie: self.movies[index.first!]))
            }
        }
    }
}

In codice supra, usus sum .onDelete actionis a SwiftUI pro singulis IP. Hoc permittit remigare in indice ut normalem iOS swipe delere. Cum usura puga pyga deletionem tangit, actionem respondentem trigger et cinematographicam e indice removet.

Bene, quia index proprietatis ex statu BindableObjecti derivatur et ut EnvironmentObjectum infunditur, album SwiftUI renovat, quia ForEach cum cinematographicis proprietatibus coniungitur.

Huc pertinet quod MoviesState reducere:

func moviesStateReducer(state: MoviesState, action: Action) -> MoviesState {
    var state = state
    switch action {
    
    // other actions.
    
    case let action as MoviesActions.AddMovieToCustomList:
        state.customLists[action.list]?.movies.append(action.movie)
        
    case let action as MoviesActions.RemoveMovieFromCustomList:
        state.customLists[action.list]?.movies.removeAll{ $0 == action.movie }
        
    default:
        break
    }
    return state
}

De reducendo supplicium est cum mittis actionem et novam rempublicam, ut dictum est.

Non tamen singillatim pergam - quomodo SwiftUI actu scit quid ostendat. Quod ut altius intellegatur, valet view WWDC session on data flow apud SwiftUI. Explicat etiam in speciali causa quare et quando utor? State, @Binding, ObjectBinding and EnvironmentObject.

Skillbox commendat:

Source: www.habr.com

Add a comment