2015-08-24 5 views
3

У меня есть массив видеофайлов, которые я хочу загрузить. Я использую цикл for для загрузки каждого из них. Однако, когда цикл работает, все файлы загружаются параллельно, что заставляет приложение зависать, пользовательский интерфейс блокируется, использование ЦП для прохождения через крышу.Alamofire: Как скачать файлы последовательно

for url in urlArray{ 
    downloadfile(url) 
} 

У меня есть функция, которая загружает файл с указанием URL-адреса.

func downloadFile(s3Url:String)->Void{ 
    Alamofire.download(.GET, s3Url, destination: destination) 
     .progress { bytesRead, totalBytesRead, totalBytesExpectedToRead in 
      println(totalBytesRead) 
     } 
     .response { request, response, _, error in 
      println(response) 
     } 
} 

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

+0

@mattt Вы могли бы предоставить пример? Я попробовал wrapping downloadFile в NSBlockOperation, но он не работал. то есть: пусть операция = NSBlockOperation - queue.addOperation (операция) – CraigH

+0

Это должно быть все, что есть к нему {()> Пустота в Println ("начиная скачать") self.downloadfile (URL!)}. Что не работает? – mattt

+1

@mattt он все равно загружает их все в одно и то же время. Я сдаюсь сейчас – CraigH

ответ

2

Что вы можете сделать, это вызывать другую функцию, когда файл завершает загрузку (т. Е. TotalBytesRead> = totalBytesExpectedToRead). В этой функции выньте следующий элемент из списка и снова вызовите функцию загрузки с новым URL-адресом. Вы можете создать массив всех URL-адресов, и когда вам понадобится новый элемент, удалите его из массива и передайте его функции загрузки. Убедитесь, что массив пуст, и если это так, вы знаете, что вы все загрузили все.

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

8
func downloadFile(var urlArray:[String])->Void{ 
    if let s3Url = urlArray.popLast(){ 
     Alamofire.download(.GET, s3Url, destination: destination) 
      .progress { bytesRead, totalBytesRead, totalBytesExpectedToRead in 
       println(totalBytesRead) 
      } 
      .response { request, response, _, error in 
       downloadFile(urlArray) 
       println(response) 
     } 
    } 
} 

быстры 3,0:

func downloadFile(urlArray:[String])->Void{ 
    var urlArray = urlArray 
    if let s3Url = urlArray.popLast(){ 
     Alamofire.download(.GET, s3Url, destination: destination) 
      .progress { bytesRead, totalBytesRead, totalBytesExpectedToRead in 
       println(totalBytesRead) 
      } 
      .response { request, response, _, error in 
       downloadFile(urlArray) 
       println(response) 
     } 
    } 
} 
+0

Функция, которая вызывает себя, является чем-то, что заставляет меня немного «бояться», но работает так, как ожидалось. (сделано так, мир не должен взорваться ...) – RikiRiocma

+0

грустно 'var' будет удален в ** Swift 3 **. Как мы можем изменить этот код? – Arefly

+3

где вы слышали, что var удаляется? – quemeful

1

Я надеюсь, что это поможет.

var urlArray:[String] =["your file link","your file link"] 

func downloadFile(url: String)->Void{ 

     let destination = DownloadRequest.suggestedDownloadDestination(for: .documentDirectory) 

     Alamofire.download(
      url, 
      method: .get, 
      encoding: JSONEncoding.default, 
      to: destination).downloadProgress(closure: { (progress) in 
       //progress closure 

      }).response(completionHandler: { (DefaultDownloadResponse) in 
       //here you able to access the DefaultDownloadResponse 
       //result closure 
       self.urlArray.removeFirst() 
       if DefaultDownloadResponse.response?.statusCode == 200 { 

        print(DefaultDownloadResponse.destinationURL) 

        if !self.urlArray.isEmpty{ 
          self.downloadFile(url: self.urlArray[0]) 
        } 
       } 

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