Как получить доступ к переменной во вложенном цикле? - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь получить доступ к значению «x» во вложенном цикле, но каждый раз, когда я пытаюсь указать значение «x» во внутреннем цикле, оно меняется.

var downloads_array = [[URL]]()//edited
func downloadImages(){

        var count = images.count
        let storage = Storage.storage().reference()

        for x in 0...count-1{
            var anime = [String]()
            anime.append(images[x])
            anime.append(images[x] + "1")
            print("outside the second loop x is : \(x)")

            for i in anime{
                let storageRef = storage.child("images/\(i).jpg")
                storageRef.downloadURL { (url, error) in
                    if let error = error{
                        print(error.localizedDescription)
                    }
                    else{
                        print(x)
                        self.downloads_array[x].append(url!)//edited
                    }
                }
            }
        }

    }

Выходное значение равно:

outside the second loop x is : 0
outside the second loop x is : 1
outside the second loop x is : 2
outside the second loop x is : 3
outside the second loop x is : 4
outside the second loop x is : 5
0
3
0
1
1
4
2
5
3
4
2
5

Я новичок в области быстрой разработки, помогите мне решить эту проблему.

Ответы [ 4 ]

0 голосов
/ 20 сентября 2018

Поскольку хранилище Firebase было асинхронным (сетевым), мы не можем сохранить значение, так как порядок будет непоследовательным.Поэтому я создал словарь со строкой и URL-адресом для хранения соответствующего URL-адреса загрузки для изображения

0 голосов
/ 17 сентября 2018

Не уверен, что именно вам нужно, но я думаю, что вы пытаетесь реализовать что-то вроде этого: -

func downloadImages(){
    var count = images.count
    let storage = Storage.storage().reference()
    var data : [String:Int] = []
    for x in 0...count-1{
        var anime = [String]()
        anime.append(images[x])
        anime.append(images[x] + "1")
        print("outside the second loop x is : \(x)")

        for i in anime {
            let storageRef = storage.child("images/\(i).jpg")
            data["YourUrl"] = x // Replace YourUrl with your url string
            storageRef.downloadURL { (url, error) in
                if let error = error{
                    print(error.localizedDescription)
                }
                else{
                    if let value = data[url.absoluteString]{
                        print(value)
                    }

                }
            }
        }
    }
}
0 голосов
/ 17 сентября 2018

storageRef.downloadURL равно async, поэтому код продолжит выполняться и значение x изменится. Решение здесь заключается в захвате текущего значения x либо через промежуточную переменную, либо через захват блока

Блок захвата

var downloads_array = [[URL]]()//edited
func downloadImages(){

    var count = images.count
    let storage = Storage.storage().reference()

    for x in 0...count-1{
        var anime = [String]()
        anime.append(images[x])
        anime.append(images[x] + "1")
        print("outside the second loop x is : \(x)")

        for i in anime{
            let storageRef = storage.child("images/\(i).jpg")
            storageRef.downloadURL { [x] (url, error) in // block capture
                if let error = error{
                    print(error.localizedDescription)
                }
                else{
                    print(x)
                    self.downloads_array[x].append(url!)//edited
                }
            }
        }
    }

}

-

Промежуточная переменная

var downloads_array = [[URL]]()//edited
func downloadImages(){

    var count = images.count
    let storage = Storage.storage().reference()

    for x in 0...count-1{
        var anime = [String]()
        anime.append(images[x])
        anime.append(images[x] + "1")
        print("outside the second loop x is : \(x)")

        for i in anime{
            let storageRef = storage.child("images/\(i).jpg")
            let currentX = x // intermediary variable
            storageRef.downloadURL { (url, error) in
                if let error = error{
                    print(error.localizedDescription)
                }
                else{
                    print(currentX)
                    self.downloads_array[currentX].append(url!)//edited
                }
            }
        }
    }

}
0 голосов
/ 17 сентября 2018

Ваш storageRef.downloadURL является асинхронным вызовом, что означает, что потребуется время для выполнения блока завершения.Цикл for будет выполнен, и вызовы count * 2 будут обработаны.В зависимости от того, как быстро получен каждый ответ, вызывается соответствующее завершение, в результате которого вы получаете порядок.

func downloadImages(){
    var count = images.count
    let storage = Storage.storage().reference()

    for x in 0...count-1{
        var anime = [String]()
        anime.append(images[x])
        anime.append(images[x] + "1")
        print("outside the second loop x is : \(x)")

        print(x) // printing it here will give you the order as is
        for i in anime {
            let storageRef = storage.child("images/\(i).jpg")
            storageRef.downloadURL { (url, error) in
                if let error = error{
                    print(error.localizedDescription)
                }
                else{
                    print(x)
                }
            }
        }
    }
}

Поскольку вы не можете контролировать порядок выполнения блока завершения.Словарь будет одним из решений вашей проблемы.Сохраните index как key и url array как значение .Или у вас может быть struct , в которой хранятся URL-адреса для соответствующего индекса, и sort it.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...