2016-05-24 2 views
0

Благодаря большому обновлению в Firebase, я переключаю хостинг изображений для своего приложения с AWS на теперь включенное GS Storage в Firebase. Я уже импортировал все необходимые контейнеры, это приложение уже успешно загружает изображения в назначенные ковши, но проблема в том, когда я хочу загрузить в память изображения, хранящиеся, а приложение сбой, отладка. Я обнаружил следующую ошибку в своем FIRStorageReference object: «использование необъявленного типа« FirebaseStorage »« Я импортирую заголовок Firebase в VC, где находится функция.FirebaseStorage проблема с загрузкой данных в память (Swift)

func getImage(imageName: String) -> UIImage { 
    let imageRef = kBucketRef.child(imageName) 
    print(imageRef) 
    var imageData: NSData? 
    var image: UIImage? 
    imageRef.dataWithMaxSize(200 * 1024) { (data, error) -> Void in 
     if (error != nil) { 
     imageData = data 
     image = UIImage(data: imageData!) 
     } else { 
      print(error?.localizedDescription) 
     } 
    } 
    return image! 
} 

позже при попытке отобразить изображение в: image.image = GetImage (ImageName) называется он выдает указанную ошибку в обратном изображении!

fatal error: unexpectedly found nil while unwrapping an Optional value

Printing description of imageRef: expression produced error: /var/folders/9q/g2rz2_hj15548cf15yrxz37c0000gn/T/lldb/1645/expr11.swift:1:46: error: use of undeclared type 'FirebaseStorage' $__lldb__DumpForDebugger(Swift.UnsafePointer< FirebaseStorage.FIRStorageReference >(bitPattern: 0x11d028fa0).memory) ^~~~~~~~~~~~~~~ /var/folders/9q/g2rz2_hj15548cf15yrxz37c0000gn/T/lldb/1645/expr11.swift:1:45: note: while parsing this '<' as a type parameter bracket $__lldb__DumpForDebugger(Swift.UnsafePointer(bitPattern: 0x11d028fa0).memory)

Выход 'печати (imageRef)' печатает GS эталонные (GS: // Проект-хххххх ...), но '.dataWithMaxSize() терпит неудачу

Заранее спасибо


(дни) Ok, вот обходной путь, так как методы FIRStorage не изменяют ВАР в отделенной функции для последующего возврата:

let bucket: String = "gs://mystoragetesterxxxxxx.appspot.com" 


func getImage() { 

    let storage = FIRStorage.storage() 
    let storageRef = storage.referenceForURL(bucket) 
    let path = storageRef.child("photo.jpg") 
    print(path) 
    path.dataWithMaxSize(1024 * 1024) { (data, error) in 
     if (error != nil) { 
      print(error!.localizedDescription) 
     } else { 
      self.imageView.image = UIImage(data: data!) 
     } 
    } 

} 

Теперь GetImage это функция тщетным, но работает

ответ

1

Вы уверены, что это не просто вопрос, где вы объявить дополнительный тип:

var image: UIImage?

Затем вызывая функцию асинхронной

imageRef.dataWithMaxSize...

, а затем, не дожидаясь его, возвращая неявно развернутый опциональный?

return image!

Кажется мне, как так изображение отсутствует, вы «неожиданно разворачивания ноль», который в значительной степени опираясь на условия гонки, чтобы добиться успеха.

Я хотел бы попробовать что-то еще, как:

var image: UIImage? 
imageRef.dataWithMaxSize(200 * 1024) { (data, error) -> Void in 
    if (error != nil) { 
     return UIImage(data: data!)! 
    } else { 
     print(error?.localizedDescription) 
    } 
} 

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

+0

Изменена функция в соответствии с вашим предложением, и она выбрасывает нуль, сохраненный путь к файлу верен, там есть файл, но он по-прежнему не присваивает его «данным», то ведро настроено как общедоступное. Это не вызывает условие (error! = Nil), оно просто не загружает изображение –

1

Try что-то вроде этого

let storage = FIRStorage.storage() 

то функция

func getImage(imageName: String) -> UIImage { 
     let gsReference = storage.referenceForURL(imageName!) 

     print(imageRef) 
     var imageData: NSData? 
     var image: UIImage? 
     let downloadTask = gsReference.dataWithMaxSize(200 * 1024) { (data, error) -> Void in 
      if (error != nil) { 
      //imageData = data 
      //image = UIImage(data: imageData!) 

      let image = UIImage.init(data: data!) 

      } else { 
       print(error?.localizedDescription) 
      } 

      downloadTask.observeStatus(.Resume) { (snapshot) -> Void in 
       print("Downloading has started") 


      } 
     } 
    return image! 
} 

Затем вы видите на журнал, началась загрузка.

+0

Перед заданием на загрузку я могу распечатать полный путь ссылки на хранилище: gs: //project-xxxxxx163293.appspot.com/images /xxxxxx.jpg, так что ссылка в порядке В dataWithMaxSize: завершение Я добавил инструкцию print («dataWithMaxSize running») перед if, а затем следующий вывод консоли - это «найденная ошибка nil» в строке обратного изображения , Я думаю, что задача не работает, а когда изображение: UIImage? получает вызов из возврата, это nil и, следовательно, ошибка. –

Смежные вопросы