Поместите значения переменных в асинхронную функцию в Swift - PullRequest
0 голосов
/ 29 октября 2018

Я реализовал функцию загрузки изображений.

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

"(value) in" Передает значение безопасно, но если код попытается поместить значение в глобальную переменную, оно не будет выполнено.

Код:

var arr = 0

ImageDownload(url: urll!) // asynchronous function
{   (value) in  // value = Image Height
    DispatchQueue.main.async
        {
            arr = value 
        }
}

// I want use this line
print("\(arr)")   // always print 0

Функция загрузки изображения:

func ImageDownload(url urll: URL, completion: @escaping (Int) -> Void)
{
    let queue = DispatchQueue.global()
    queue.async
        {
            if let imageSource = CGImageSourceCreateWithURL(urll as CFURL, nil)
            {
                if let imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) as Dictionary?
                {
                    let pixelHeight = imageProperties[kCGImagePropertyPixelHeight] as! Int

                    if pixelHeight >= 2000
                    {
                        completion(pixelHeight/6)
                    }
                    else
                    {
                        completion(pixelHeight/5)
                    }
                }
            }
        }
}

Пожалуйста, помогите мне

1 Ответ

0 голосов
/ 29 октября 2018

Вы должны использовать значение / print arr вне блока и перед выполнением блока. Попробуйте переместить оператор печати в блок завершения

ImageDownload(url: urll!) { (value) in
  // value = Image Height
  DispatchQueue.main.async {
    arr = value
    print("\(arr)")
  }
}

Я имею в виду выполнять вашу операцию только после arr назначения Вы также можете использовать didSet из arr.

var arr = 0 {
  didSet {
    // Add your code here you want to execute after value assignment to `arr` 
    print("\(arr)")
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...