2017-11-23 15 views
0

에 내가 루프, 루프 내부 그래서 그래 비동기 작업 ...completionhandler 루프

그게 내가 DispatchGroups() 포함 된 이유에 대한 내부 completionhandler를 실행하고 대한 :

for fileName in fileNames { 
    group.enter() 
    let url = URL(fileURLWithPath: "\(self.documentsUrl.path)/\(fileName)") 
    let ref = storage.reference().child("pathTo/\(fileName)") 
    let _ = ref.putFile(from: url, metadata: nil) { metadata, error in 
     print("completed") 
     if let error = error { 
      print("error") 
     } else { 
      print("success") 
     } 
     self.removeFile() 
     group.leave() 
    } 
    } 
    group.notify(queue: .main, execute: { 
     print("finished") 
    }) 

음을의 filepath가 존재하지만, 콘솔에는 아무 것도 인쇄되지 않지만 각 비동기 작업이 완료된 후에 알림을 받아야합니다. 아무도 이걸 도와 줄 수 없나요?

+0

group.enter 대신 DispatchQueue.main.async {} 메소드에 코드를 모두 입력하면 어떻게됩니까? –

+0

중단 점을 넣고 인쇄 내용을 확인하십시오. btw "completed"가 인쇄 중이십니까? –

+0

안녕하세요, DispatchQueue.main.async {}가 포함되어 있으며 콘솔에 인쇄가 없습니다 .. 아무에게도 콜백 작동 방법을 안내해 드릴 수 있으므로 성공/오류 이벤트에 반응 할 수 있습니까? –

답변

0

저는 입니다. 애셋입니다. Firebase에 업로드 중입니다. 시도 것들의

커플 : 변경 let _ = ref.putFile(from: url..., 그리고
let uploadObj = ref.putFile(from: url...에 루프이 할 당신의 마지막 줄 : uploadObj.resume()합니다.

그래도 작동하지 않는다면 Firebase의 프레임 워크가 여러 개의 동시 업로드를 처리 할 수 ​​없다는 것이 가장 좋습니다. 해결책은 각 파일 업로드가 완료 될 때까지 기다린 후 다음 파일을 업로드하는 것입니다.

코드를 사용해 볼 수도 있지만 파일을 하나만 업로드 할 수 있습니다. 문제가 해결되면 동시 업로드 문제가 발생할 가능성이 큽니다. 2로 시도한 다음 실패하지 않으면 계속 진행하십시오. 그것이 결국 실패한다면, 동시성은 분명히 중요한 문제입니다.

동시 업로드를 시도하는 경우 Google's documentation on this으로 이동하여 업로드를 모니터링하기위한 예제를 구현하십시오. 그러면 업로드 할 때마다 어떤 일이 일어나는지 정확하게 볼 수 있습니다.

업데이트 :
This post 님의 답변은 한 번에 하나씩 업로드하는 것이 좋습니다.