我有两个不同的端点:
我从第一个端点和第二个端点映射对象,因此当我显示对象时,它们具有相同的对象,并且只限制了10项。
问题是..。这样就可以将调用的API组合起来,这样我就可以在不同的端点上使用分页了吗?所以结果是
到目前为止,我还不知道如何组合API,这是我的服务设置
func getMessageList(page: Int) -> Single<[Message]> {
        return platformBanking.getMessageList(token: sessionStore.token, page: page, pageSize: 10)
    }
func getMoInbox() -> Single<[Message]> {
        return Single.create { single in
            MOInbox.sharedInstance.getInboxMessages { inboxMessages, accountMeta in
                var messages: [Message] = []
                inboxMessages.forEach { entry in
                    let message: Message = .init()
                    message.title = entry.notificationTitle
                    message.subtitle = entry.notificationSubTitle
                    message.body = entry.notificationBody
                    message.messageType = !(entry.campaignID?.isEmpty ?? false) ? 5 : 1
                    message.imageName = entry.notificationMediaURL ?? ""
                    message.date = entry.receivedDate?.string(withFormat: "dd MMM") ?? ""
                    message.isRead = entry.isRead
                    message.action = entry.deepLinkURL ?? ""
                    messages.append(message)
                }
                single(.success(messages))
            }
            return Disposables.create()
        }
    }这在我的ViewModel里
var filterMessages: [Message] = []
private var page: Int = 1
private var isLoading: Bool = false
private var endOfMessage: Bool = false
private func getMessageInboxList() {
        var inboxMessages: [Message] = []
        isLoading = true
        Single.zip(manageMessages.getMessageList(page: page), manageMessages.getMoInbox())
            .subscribe(onSuccess: { [weak self] firstMessage, secondMessage in
                inboxMessages.append(contentsOf: firstMessage)
                inboxMessages.append(contentsOf: secondMessage)
                self?.processMessages(messages: inboxMessages)
            }).disposed(by: disposedBag)
    }
    private func processMessages(messages: [Message]) {
        self.messages.append(contentsOf: messages)
        self.filterMessages = self.messages.sorted(by: { $0.date > $1.date })
        eventShowHideLoadingIndicator.onNext(false)
        if messages.count < 10 {
            endOfMessage = true
        }
        eventMessagesDataUpdated.onNext(())
        isLoading = false
    }这是一个在viewModel中调用分页的函数,当我尝试分页时,我才意识到我从getMoInbox API中创建了一个复制项。但仍然结合对象和限制为10项,我仍然找不到答案。
func loadMoreMessageInbox() {
        guard !endOfMessage, !isLoading, selectedIndex == 0 else { return }
        page = page + 1
        getMessageInboxList()
}请帮帮我伙计们。
发布于 2022-11-25 13:21:38
这需要一个状态机。您可以使用许多不同的库(部分列表位于底部)。
下面是一个使用来自cycle的我的图书馆函数的示例。
enum Input {
    case nextPageRequested // emit this to `input` when you are ready for the next page.
    case pageReceived(Int, [Message]) // this is emitted with the page results.
}
struct State<T> {
    var pages: [Int: [T]] = [:] // stores the pages as they come in. The MoMessages will be stored in page 0
}
func example(input: Observable<Input>, messageManager: MessageManager) -> Observable<[Message]> {
    Single.zip(messageManager.getMoInbox(), messageManager.getMessageList(page: 1))
        .asObservable()
        .flatMap { moMessages, page1Messages in
            // create state machine initialized with the moMessages and page1Messages
            cycle(
                input: input,
                initialState: State(pages: [0: moMessages, 1: page1Messages]),
                reduce: { state, input in
                    // when a new page is received, store it
                    if case let .pageReceived(page, messages) = input {
                        state.pages[page] = messages
                    }
                },
                reaction: reaction(
                    request: { state, input in
                        // when a new page is requested, figure out what page number you need and return it (otherwise return nil)
                        guard case .nextPageRequested = input else { return nil }
                        return state.pages.keys.max() + 1
                    },
                    effect: { page in
                        // get the page you need
                        messageManager.getMessageList(page: page)
                            .map { Input.pageReceived(page, $0) }
                            .asObservable()
                    }
                )
            )
        }
        .map { state in
            // sort the messages in the pages and return them
            state.pages.values.flatMap { $0 }.sorted(by: { $0.date > $1.date })
        }
}这是承诺的清单:
https://stackoverflow.com/questions/74568146
复制相似问题