2016-08-14 4 views
0

я пытаюсь загрузить или загрузить изображения с помощью Nuke (рамок для загрузки и кэширование изображений) и Firebase для загрузки изображений в качестве интерфейсаЗагрузка/загрузка нескольких изображений в правильном направлении?

для одного файла это легко справиться без каких-либо проблем но для нескольких я действительно не знаю, что делать правильно У меня проблемы, когда он не выполняет эту работу синхронно Загружает второе изображение перед первым, иногда

Я покажу свой способ загрузка и загрузка нескольких изображений

Для загрузки я поставил код для цикла

func downloadImages(completion: (result: [ImageSource]) -> Void){ 
    var images = [ImageSource]() 
    for i in 0...imageURLs.count-1{ 

     let request = ImageRequest(URL: NSURL(string:imageURLs[i])!) 

     Nuke.taskWith(request) { response in 
      if response.isSuccess{ 
     let image = ImageSource(image: response.image!) 
       images.append(image) 
       if i == self.imageURLs.count-1 { 
        completion(result: images) 
       } 
      } 


     }.resume() 


    } 

} 

И для загрузки, где пользователь выбирает изображения сборщика изображений форму и вернуть его как NSData массив А затем выполнить этот код

func uploadImages(completion: (result: [String]) -> Void){ 
    let storageRef = storage.referenceForURL("gs://project-xxxxxxxxx.appspot.com/Uploads/\(ref.childByAutoId())") 
    var imageUrl = [String]() 
    var imgNum = 0 



    for i in 0...imageData.count-1 { 
     let imagesRef = storageRef.child("\(FIRAuth.auth()?.currentUser?.uid) \(imgNum)") 
     imgNum+=1 

     let uploadTask = imagesRef.putData(imageData[i], metadata: nil) { metadata, error in 
      if (error != nil) { 
       print("error") 
       imageUrl = [String]() 
       completion(result: imageUrl) 
      } else { 

       print("uploading") 
       // Metadata contains file metadata such as size, content-type, and download URL. 
       let downloadURL = metadata!.downloadURL()?.absoluteString 
       print(downloadURL) 
       imageUrl.append(downloadURL!) 
       if i == imageUrl.count-1{ //end of the loop 
        print("completionUpload") 
        completion(result: imageUrl) 

       } 
      } 
     }} 

Это хороший способ выполнить эту задачу?

Что мне делать, чтобы каждое скачивание изображений было упорядочено?

пожалуйста, дайте мне что-нибудь, что может помочь пример кода, ссылка и т.д. ..

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

ответ

1

Мы настоятельно рекомендуем использовать Firebase хранения и базы данных Firebase в реальном времени вместе, чтобы выполнить список загрузок:

Shared:

// Firebase services 
var database: FIRDatabase! 
var storage: FIRStorage! 
... 
// Initialize Database, Auth, Storage 
database = FIRDatabase.database() 
storage = FIRStorage.storage() 

Загрузить:

let fileData = NSData() // get data... 
let storageRef = storage.reference().child("myFiles/myFile") 
storageRef.putData(fileData).observeStatus(.Success) { (snapshot) in 
    // When the image has successfully uploaded, we get it's download URL 
    let downloadURL = snapshot.metadata?.downloadURL()?.absoluteString 
    // Write the download URL to the Realtime Database 
    let dbRef = database.reference().child("myFiles/myFile") 
    dbRef.setValue(downloadURL) 
} 

Скачать:

let dbRef = database.reference().child("myFiles") 
dbRef.observeEventType(.ChildAdded, withBlock: { (snapshot) in 
    // Get download URL from snapshot 
    let downloadURL = snapshot.value() as! String 

    // Now use Nuke (or another third party lib) 
    let request = ImageRequest(URL: NSURL(string:downloadURL)!) 
    Nuke.taskWith(request) { response in 
    // Do something with response 
    } 

    // Alternatively, you can use the Storage built-ins: 
    // Create a storage reference from the URL 
    let storageRef = storage.referenceFromURL(downloadURL) 
    // Download the data, assuming a max size of 1MB (you can change this as necessary) 
    storageRef.dataWithMaxSize(1 * 1024 * 1024) { (data, error) -> Void in 
    // Do something with data... 
    }) 
}) 

Для получения дополнительной информации см Zero to App: Develop with Firebase, и это associated source code, практический пример того, как сделать это.

+0

Спасибо, я решил его по вызову в рамках завершения загрузки изображения и добавления некоторых if-утверждений, теперь он работает так, как ожидалось, и никогда не возвращается без завершения загрузки –

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