首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >组合来自不同端点的对象数组,这样它也可以分页。

组合来自不同端点的对象数组,这样它也可以分页。
EN

Stack Overflow用户
提问于 2022-11-25 03:47:58
回答 1查看 25关注 0票数 1

我有两个不同的端点:

  1. 第一个有页码。
  2. 第二个没有分页

我从第一个端点和第二个端点映射对象,因此当我显示对象时,它们具有相同的对象,并且只限制了10项。

问题是..。这样就可以将调用的API组合起来,这样我就可以在不同的端点上使用分页了吗?所以结果是

  1. 将对象合并为1
  2. 按日期排序
  3. 限制项目仅10项

到目前为止,我还不知道如何组合API,这是我的服务设置

代码语言:javascript
运行
复制
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里

代码语言:javascript
运行
复制
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项,我仍然找不到答案。

代码语言:javascript
运行
复制
func loadMoreMessageInbox() {
        guard !endOfMessage, !isLoading, selectedIndex == 0 else { return }
        page = page + 1
        getMessageInboxList()
}

请帮帮我伙计们。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-25 13:21:38

这需要一个状态机。您可以使用许多不同的库(部分列表位于底部)。

下面是一个使用来自cycle我的图书馆函数的示例。

代码语言:javascript
运行
复制
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 })
        }
}

这是承诺的清单:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74568146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档