Как вы последовательно цепочки наблюдаемых в краткой и удобочитаемой форме - PullRequest
0 голосов
/ 23 января 2019

Я новичок в RXSwift, и я начал исследовать, как я могу выполнять Promise, как цепочку функций.

Я думаю, что я на правильном пути, используя flatmap, но моя реализация очень трудна для чтения, поэтому я подозреваю, что есть лучший способ сделать это.

Кажется, что то, что у меня есть, работает, но у меня разболелась мысль о том, как это может выглядеть, если я добавлю еще 3 или функции в цепочку.

Здесь я объявляю свою «цепочку обещаний» (трудно читаемую)

LOGIN().flatMap{ (stuff) -> Observable<Int> in
    return API(webSiteData: stuff).flatMap
    { (username) -> Observable<ProfileResult> in
    return accessProfile(userDisplayName: username) }
    }.subscribe(onNext: { event in
        print("The Chain Completed")
        print(event)
    }, onError:{ error in
         print("An error in the chain occurred")
    })

Это три примера функций, которые я создаю в цепочке

struct apicreds
{
    let websocket:String
    let token:String
}
typealias APIResult = String
typealias ProfileResult = Int

// FUNCTION 1
func LOGIN() -> Observable<apicreds> {

    return Observable.create { observer in
        print("IN LOGIn")
        observer.onNext(apicreds(websocket: "the web socket", token: "the token"))
        observer.on(.completed)
        return Disposables.create()
    }
}
// FUNCTION 2
func API(webSiteData: apicreds) -> Observable<APIResult> {

    return Observable.create { observer in
        print("IN API")
        print (webSiteData)
       // observer.onError(myerror.anError)
        observer.on(.next("This is the user name")) // assiging "1" just as an example, you may ignore
        observer.on(.completed)
        return Disposables.create()
    }

}
//FUNCTION 3
func accessProfile(userDisplayName:String)  -> Observable<ProfileResult>
{
    return Observable.create { observer in

        // Place your second server access code
        print("IN Profile")
        print (userDisplayName)

        observer.on(.next(200)) // 200 response from profile call
        observer.on(.completed)
        return Disposables.create()
    }
}

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Вы также можете использовать стиль без точек и просто передавать ссылки на функции в flatMap:

LOGIN()
    .flatMap(API)
    .flatMap(accessProfile)
    .subscribe(onNext: { event in
        print("The Chain Completed")
        print(event)
    }, onError:{ error in
        print("An error in the chain occurred")
    })
0 голосов
/ 24 января 2019
  1. В дополнение к вложенному flatMap и форматированию кода вы можете опустить return и явные типы возврата:
LOGIN()
    .flatMap { webSiteData in API(webSiteData: webSiteData) }

имена параметров

LOGIN()
    .flatMap { API(webSiteData: $0) }

или вообще удалить параметры, если это необходимо:

LOGIN()
    .flatMap(API)
    .flatMap(accessProfile)
    .subscribe(
        onNext: { event in
            print(event)
        }, onError:{ error in
            print(error)
        }
    )
К вашему сведению, здесь был бы удобен Observable.just метод:
struct ApiCredentials {
    let websocket: String
    let token: String
}

func observeCredentials() -> Observable<ApiCredentials> {
    let credentials = ApiCredentials(websocket: "the web socket", token: "the token")
    return Observable.just(credentials)
}
Попробуйте следовать официальным Руководствам по Swift API , чтобы сделать ваш код более читабельным.
0 голосов
/ 23 января 2019

Это очень распространенная проблема, с которой мы сталкиваемся при цепочке операций.Как новичок я написал аналогичный код, используя RxSwift и в моих проектах.И есть две области улучшения: 1. Измените код для удаления вложенных плоских карт. 2. Отформатируйте его по-разному, чтобы упростить последовательность:

LOGIN()
    .flatMap{ (stuff) -> Observable<APIResult> in
        return API(webSiteData: stuff)
    }.flatMap{ (username) -> Observable<ProfileResult> in
        return accessProfile(userDisplayName: username) 
    }.subscribe(onNext: { event in
        print("The Chain Completed")
        print(event)
    }, onError:{ error in
        print("An error in the chain occurred")
    })
...