Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 减少或Flatmap json对单个数组的响应_Ios_Swift_Rx Swift - Fatal编程技术网

Ios 减少或Flatmap json对单个数组的响应

Ios 减少或Flatmap json对单个数组的响应,ios,swift,rx-swift,Ios,Swift,Rx Swift,我有一个json响应消息体,如下所示。就我的UI而言,顶级消息只是列表中的第一条消息 { "messageId": "1234-1234-1234", "jobId": "1234-1234-1234", "message": "This is the top level message", "createdDate": "2019-03-18T14:55:21.467", "user": {}, "messages": [{

我有一个json响应消息体,如下所示。就我的UI而言,顶级消息只是列表中的第一条消息

{
    "messageId": "1234-1234-1234",
    "jobId": "1234-1234-1234",
    "message": "This is the top level message",
    "createdDate": "2019-03-18T14:55:21.467",
    "user": {},
    "messages": [{
            "messageId": "1234-1234-1234",
            "jobId": "1234-1234-1234",
            "message": "This is the a child message",
            "createdDate": "2019-03-18T14:55:21.467",
            "user": {},
            "messages": [],
            "attachments": []
        },
        {
            "messageId": "1234-1234-1234",
            "jobId": "1234-1234-1234",
            "message": "This is the another child message",
            "createdDate": "2019-03-18T14:55:21.467",
            "user": {},
            "messages": [],
            "attachments": []
        },
        {
            "messageId": "1234-1234-1234",
            "jobId": "1234-1234-1234",
            "message": "This is the yet another child message",
            "createdDate": "2019-03-18T14:55:21.467",
            "user": {},
            "messages": [],
            "attachments": []
        }
    ],
    "attachments": []
}
服务器实体

struct MessageServer: Codable {
let messageId: String
let jobId: String
let message: String
let createdDate: Date
let user: User
let messages: [MessageServer]
let attachments: [FileServer]

init(messageId: String,
     jobId: String,
     message: String,
     createdDate: Date,
     user: User,
     messages: [MessageServer],
     attachments: [FileServer]
    ) {

    self.messageId = messageId
    self.jobId = jobId
    self.message = message
    self.createdDate = createdDate
    self.user = user
    self.messages = messages
    self.attachments = attachments
}
}

应用实体

struct Message: Codable {
let message: String
let createdDate: Date
let displayName: String
let isMine: Bool
let attachments: [File]

init(message: String, createdDate: Date, displayName: String, isMine: Bool, attachments: [File]) {
    self.message = message
    self.createdDate = createdDate
    self.displayName = displayName
    self.isMine = isMine
    self.attachments = attachments
}
}

在我的服务调用中,我只想返回一个可观察的消息数组

func getMessages(sectionID id: String) -> Observable<[Message]> {
    return messageServiceEndpoints
        .getMessages(for: id)
        .map({
            $0.map({
                Message( /* init message here */ )
             })
         })
}
func getMessages(sectionID:String)->可观察{
返回消息ServiceEndpoints
.getMessages(用于:id)
.地图({
$0.05地图({
消息(/*此处初始化消息*/)
})
})
}

有没有一种方法可以将其缩减或平面映射到单个阵列

这不是一个真正的RxSwift问题。。。您只需要解析JSON:

struct Message: Decodable {
    let messageId: String
    let message: String
    let createdDate: Date
    private (set) var messages: [Message]
    // and the rest...

    var droppedMessages: Message {
        var result = self
        result.messages = []
        return self
    }
}

func parseMessages(from data: Data) throws -> [Message] {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyy-MM-dd'T'HH:mm:ss.SSS"
    let decoder = JSONDecoder()
    decoder.dateDecodingStrategy = .formatted(dateFormatter)
    let response = try decoder.decode(Message.self, from: data)
    return [response.droppedMessages] + response.messages
}

我目前通过将此方法添加到我的服务器实体来解决此问题

/// Creates a single list of [MessageServer] with the parent message at index 0
func flattenMessages() -> [MessageServer] {
    var tmpMessages: [MessageServer] = []
    let parent = MessageServer(messageId: messageId
                                jobId: jobId
                                message: message
                                createdDate: createdDate
                                user: user
                                messages: messages
                                attachments: attachments)

    tmpMessages.append(parent)
    return tmpMessages + messages
}
在我的服务呼叫中获取消息

func getMessages(sectionID id: String) -> Observable<[Message]> {
        return laborServiceEndpoints
            .getLaborOrderMessages(for: id)
            .map({
                $0.flattenMessages().map({
                    Message(message: $0.message,
                            createdDate: $0.createdDate,
                            displayName: $0.user.displayName
                            isMine: $0.user.id == userId,
                            attachments: $0.attachments.map({ File(name: $0.title,
                                                                   type: DocumentType(rawString: $0.fileType),
                                                                    url: $0.url)
                        })
                    )
                })
            })
    }
func getMessages(sectionID:String)->可观察{
返回服务端点
.getLaborOrderMessages(用于:id)
.地图({
$0.plantMessages().map({
消息(消息:$0.5),
createdDate:$0.createdDate,
displayName:$0.user.displayName
isMine:$0.user.id==userId,
附件:$0.attachments.map({文件名:$0.title,
类型:DocumentType(原始字符串:$0.fileType),
url:$0.url)
})
)
})
})
}

不确定RX,但在map关闭后,您可以使用。flatMap{$0}可能会有帮助。对不起,我想我只是因为包含了JSON响应而把事情弄糊涂了。我已经将响应解析为MessageServer obj。我的目标是让我的服务调用获取该可观察对象并将其映射为可观察对象。我已经更新了我的问题,包括我的服务器和应用实体,并发布了我当前解决方案的答案。如果你能找到更好的方法,我会很感激你的意见。感谢此解决方案直接从JSON数据生成您请求的结果。你的答案似乎是做同样事情的更复杂的方式。