Я реализовал функцию загрузки изображений.
Однако я обнаружил, что пользовательский интерфейс застопорился, и у меня была асинхронная функция.
"(значение) 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
Функция ImageDownload:
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)
}
}
}
}
}
Пожалуйста, помогите мне
Все в приведенном выше коде верны, просто убедитесь, что значение, возвращаемое ImageDownload, не равно нулю,
Можете ли вы добавить свою функцию ImageDownload
Я добавил функцию ImageDownload
Где arrnil? (Или вы имеете в виду, что это 0, поскольку это не является необязательным). Вы пытаетесь получить доступ к arr до завершения сетевой операции?
При выходе из ImageDownload (url: urll!) Значение arr инициализируется равным 0.





Вы должны использовать / печатать значение 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)")
}
}
Я не решил его полностью, но у меня есть направление.
arr должен быть сильным, а не слабым, необязательным.