Проход по массиву, проверка каждого элемента с помощью функции сетевого вызова / обратного вызова, а затем переход к значению по умолчанию, если нужный элемент не найден - PullRequest
1 голос
/ 16 октября 2019

Из-за очень специфической природы этого вопроса я нигде не мог найти ответ. По сути, я хочу создать обмен сообщениями с конкретным пользователем, но только если разговор с этим пользователем еще не существует. Я зацикливаюсь на массиве разговоров, и для каждого разговора я получаю идентификационные данные другого пользователя через вызов моего бэкэнда. Однако, если беседа с конкретным пользователем не найдена, я хочу создать новую беседу. Вот что я делаю:

for convo in convos {
    HTTPManager.getOtherUserFromConversation(conversation: convo, success: { (otherUser) in
        if desiredUser == otherUser {
            //Found the desired conversation, so bring the user 
            //to it instead of creating a new one
        }
    }, failure: {
        //Networking failure
    })     
}
//IF WE DIDN'T FIND IT, CREATE A NEW CONVERSATION HERE

Я думал о создании логического значения под названием «найдено» и установке его на true, если мы найдем нужный разговор, но я не знаю, как это сделать. дождитесь выполнения последнего обратного вызова перед проверкой этого логического значения, чтобы избежать слишком раннего вызова проверки. Кто-нибудь может указать мне правильное направление?

Ответы [ 2 ]

1 голос
/ 16 октября 2019

Классическим решением для этого является использование dispatch-group https://developer.apple.com/documentation/dispatch/dispatchgroup

Для этого существует множество примеров кода. Идея состоит в том, что каждый сетевой вызов должен быть в отдельной задаче, и система сообщает вам, когда все задачи выполнены (здесь вы проверяете «найдено»).

0 голосов
/ 16 октября 2019

Как насчет создания функции обратного вызова, которая будет вызываться при выполнении всего запроса на проверку конво или когда найден правильный конво.

func checkConvoIfExist(convos: [Convo]){
    var found = false
    var countCheck = 0

    for convo in convos {
        HTTPManager.getOtherUserFromConversation(conversation: convo, success: { (otherUser) in
            countCheck += 1
            if desiredUser == otherUser {
                //Found the desired conversation
                found = true
                callbackCheckConvo(result: found, convo: convo)
                break // to stop the loop
            }else{
                if (countCheck == convos.count){
                    callbackCheckConvo(result: found)
                }
            }
        }, failure: {
            //Networking failure
            countCheck += 1
            if (countCheck == convos.count){
              callbackCheckConvo(result: found)
            }
        })     
    } 
}

func callbackCheckConvo(result: Bool, convo: Convo = nil){
    if (result){
       //found the desired conversation, so bring the user to it instead of creating a new one
    }else{
       //convo not found, create new one
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...