How to implement comments and reply system in iOS

2019-04-16 08:06发布

问题:

I have to implement comment and reply system in my application. I am getting the data from the API and I don't understand how to do this cause I have not done anything like this before. I know I have to take two different cells for this type of system but I don't Know how to filter the data for comments and replies and show them in their respective cells.

Here is how my JSON:

[
    {
        "firstName": "Mark",
        "lastName": "King",
        "profilePic": "avatar2 - Copy - Copy.jpg",
        "reviewId": 54,
        "userId": 4,
        "serviceProviderId": 0,
        "rating": 0,
        "description": "Thank You...",
        "isDeleted": false,
        "parentReviewId": 53,
        "createdDate": "2018-05-08T12:32:43.033",
        "modifiedDate": "0001-01-01T00:00:00",
        "bookingId": 62,
        "startDate": "2018-05-08T12:29:00",
        "endDate": "2018-05-08T14:29:00",
        "serviceName": "Security",
        "businessId": 0,
        "businessProfilePic": ""
    },
    {
        "firstName": "Satya Indra",
        "lastName": "varada",
        "profilePic": "3354757569.jpg",
        "reviewId": 53,
        "userId": 9,
        "serviceProviderId": 0,
        "rating": 4,
        "description": "nice service...",
        "isDeleted": false,
        "parentReviewId": 0,
        "createdDate": "2018-05-08T12:31:44.313",
        "modifiedDate": "0001-01-01T00:00:00",
        "bookingId": 62,
        "startDate": "2018-05-08T12:29:00",
        "endDate": "2018-05-08T14:29:00",
        "serviceName": "Security",
        "businessId": 0,
        "businessProfilePic": ""
    },
    {
        "firstName": "Mark",
        "lastName": "King",
        "profilePic": "avatar2 - Copy - Copy.jpg",
        "reviewId": 52,
        "userId": 4,
        "serviceProviderId": 0,
        "rating": 0,
        "description": "sorry for the trouble",
        "isDeleted": false,
        "parentReviewId": 9,
        "createdDate": "2018-05-07T11:52:23.81",
        "modifiedDate": "0001-01-01T00:00:00",
        "bookingId": 16,
        "startDate": "2018-04-24T11:30:00",
        "endDate": "2018-04-24T12:30:00",
        "serviceName": "Cleaning",
        "businessId": 2,
        "businessProfilePic": "logo-home.png"
    },
    {
        "firstName": "James",
        "lastName": "Miller",
        "profilePic": "avatar.jpg",
        "reviewId": 9,
        "userId": 7,
        "serviceProviderId": 0,
        "rating": 2,
        "description": "bad",
        "isDeleted": false,
        "parentReviewId": 0,
        "createdDate": "2018-04-24T23:59:06.357",
        "modifiedDate": "0001-01-01T00:00:00",
        "bookingId": 16,
        "startDate": "2018-04-24T11:30:00",
        "endDate": "2018-04-24T12:30:00",
        "serviceName": "Cleaning",
        "businessId": 2,
        "businessProfilePic": "logo-home.png"
    },
    {
        "firstName": "Mark",
        "lastName": "King",
        "profilePic": "avatar2 - Copy - Copy.jpg",
        "reviewId": 2,
        "userId": 4,
        "serviceProviderId": 0,
        "rating": 0,
        "description": "Thank you",
        "isDeleted": false,
        "parentReviewId": 1,
        "createdDate": "2018-04-20T14:57:29.073",
        "modifiedDate": "0001-01-01T00:00:00",
        "bookingId": 2,
        "startDate": "2018-04-25T00:00:00",
        "endDate": "2018-04-26T09:00:00",
        "serviceName": "Security",
        "businessId": 0,
        "businessProfilePic": ""
    },
    {
        "firstName": "James",
        "lastName": "Miller",
        "profilePic": "avatar.jpg",
        "reviewId": 1,
        "userId": 7,
        "serviceProviderId": 0,
        "rating": 4,
        "description": "Great",
        "isDeleted": false,
        "parentReviewId": 0,
        "createdDate": "2018-04-20T14:56:57.34",
        "modifiedDate": "0001-01-01T00:00:00",
        "bookingId": 2,
        "startDate": "2018-04-25T00:00:00",
        "endDate": "2018-04-26T09:00:00",
        "serviceName": "Security",
        "businessId": 0,
        "businessProfilePic": ""
    }
]

Here all the dictionaries represent comments and reviews coming in a single array. The difference is the bookingId of any comment will be same to reply and reviewId of a comment will be equal to parentReviewId of reply. If a reply is already there it should be shown below it's respective comment if there is no reply we should be able to add it by clicking on the Reply button in comment cell. This is the concept and I really tried for it I can't do it. Hope you guys can help me do it.. Thanks for any help in advance..

回答1:

The best practice of API response should be like, reply should be in the comments dictionary. Like:

{
    "firstName": "James",
    "lastName": "Miller",
    "profilePic": "avatar.jpg",
    "reviewId": 9,
    "userId": 7,
    "serviceProviderId": 0,
    "rating": 2,
    "description": "bad",
    "isDeleted": false,
    "parentReviewId": 0,
    "createdDate": "2018-04-24T23:59:06.357",
    "modifiedDate": "0001-01-01T00:00:00",
    "bookingId": 16,
    "startDate": "2018-04-24T11:30:00",
    "endDate": "2018-04-24T12:30:00",
    "serviceName": "Cleaning",
    "businessId": 2,
    "businessProfilePic": "logo-home.png"
    "replies": [
            {
                "firstName": "Mark",
                "lastName": "King",
                "profilePic": "avatar2 - Copy - Copy.jpg",
                "reviewId": 52,
                "userId": 4,
                "serviceProviderId": 0,
                "rating": 0,
                "description": "sorry for the trouble",
                "isDeleted": false,
                "parentReviewId": 9,
                "createdDate": "2018-05-07T11:52:23.81",
                "modifiedDate": "0001-01-01T00:00:00",
                "bookingId": 16,
                "startDate": "2018-04-24T11:30:00",
                "endDate": "2018-04-24T12:30:00",
                "serviceName": "Cleaning",
                "businessId": 2,
                "businessProfilePic": "logo-home.png"
            },
            {
                "firstName": "Mark",
                "lastName": "King",
                "profilePic": "avatar2 - Copy - Copy.jpg",
                "reviewId": 60,
                "userId": 4,
                "serviceProviderId": 0,
                "rating": 0,
                "description": "sorry for the trouble new",
                "isDeleted": false,
                "parentReviewId": 9,
                "createdDate": "2018-05-07T11:52:23.81",
                "modifiedDate": "0001-01-01T00:00:00",
                "bookingId": 16,
                "startDate": "2018-04-24T11:30:00",
                "endDate": "2018-04-24T12:30:00",
                "serviceName": "Cleaning",
                "businessId": 2,
                "businessProfilePic": "logo-home.png"
            }
        ]
}

But in current condition, you could check for the parentReviewId. If it is 0, then it is reply otherwise a comment. You can this as:

    let responseArray = [[String: Any]]() // This is array fro your question

    // Extract commentArray
    let commentArray = responseArray.filter( { Int(exactly: $0["parentReviewId"] as! NSNumber) == 0  } )
    // Load updatedResponseArray with relpies into it
    var updatedResponseArray = [[String: Any]]()

    for itemDict in commentArray {
        let reviewId = Int(exactly: itemDict["reviewId"] as! NSNumber) ?? 0
        let replies = responseArray.filter( { Int(exactly: $0["parentReviewId"] as! NSNumber) == reviewId  } )

        var dict = itemDict
        dict["replies"] = replies
        updatedResponseArray.append(dict)
    }

    print(updatedResponseArray)

Now, you can use this updatedResponseArray, main detail in dictionary are comments and you have the related replies to that comment in replies key.