2017-02-20 7 views
0

일부 파일을 장치로 다운로드하기 위해 구문 분석을 사용하면 모든 것이 좋지만 파스가 저장하는 기본 캐시 디렉토리 (/ Library/Caches/PFFileCache /)에서 다음 파일로 이동하려고합니다. 어딘가에 더 안정 사용자 문서 디렉토리라고.다운로드 후 파일 이동

Error: “7b54d8a0f1a64b710058d4408ca4d696_The%20Name%20of%20the%20Wind%2029-92.mp3” couldn’t be moved to “Documents” because either the former doesn't exist, or the folder containing the latter doesn't exist. 

하지만 모두가 존재 확신 :

내가 무엇입니까 지역화 된 오류입니다. 그것은 파일 이름에 인코딩 된 % 20이없는 PFFile의 이름과 같은 이름과 관련이있을 수 있습니다.

이 내 코드 블록 :

let cachedPFFile = object.object(forKey: "partAudio") as! PFFile 
     print(cachedPFFile) 
    let getCachedFilePath = cachedPFFile.getPathInBackground() 
     getCachedFilePath.waitUntilFinished() 
    let cachedFilePath = getCachedFilePath.result as! String 
     print(cachedFilePath) 

    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) 
    let documentsDirectory = String(describing: paths[0]) 

    let saveDirectory = documentsDirectory.appending(cachedPFFile.name) 

     print(documentsDirectory) 
     print(saveDirectory) 

    let fileManager = FileManager.default 

    if fileManager.fileExists(atPath: saveDirectory) == false { 

     do { 
      try fileManager.moveItem(atPath: cachedFilePath, toPath: saveDirectory) 
      print("Move successful") 
     } catch let error { 
      print("Error: \(error.localizedDescription)") 
     } 

    } 

이 전체 로그입니다 : 파일 및 새 디렉터리가 모두 존재하기 때문에

<PFFile: 0x608000458f00> 
2017-02-20 18:42:35.430 ParseStarterProject-Swift[2260:55934] Warning: A long-running operation is being executed on the main thread. 
Break on warnBlockingOperationOnMainThread() to debug. 
/Users/Genie/Library/Developer/CoreSimulator/Devices/A2FB00CE-B018-4FDF-9635-35FD6678DF8D/data/Containers/Data/Application/BA7C112C-BECB-4734-8C67-A9CB84F0E1F3/Library/Caches/Parse/PFFileCache/7b54d8a0f1a64b710058d4408ca4d696_The%20Name%20of%20the%20Wind%2029-92.mp3 
file:///Users/Genie/Library/Developer/CoreSimulator/Devices/A2FB00CE-B018-4FDF-9635-35FD6678DF8D/data/Containers/Data/Application/BA7C112C-BECB-4734-8C67-A9CB84F0E1F3/Documents/ 
file:///Users/Genie/Library/Developer/CoreSimulator/Devices/A2FB00CE-B018-4FDF-9635-35FD6678DF8D/data/Containers/Data/Application/BA7C112C-BECB-4734-8C67-A9CB84F0E1F3/Documents/7b54d8a0f1a64b710058d4408ca4d696_The Name of the Wind 29-92.mp3 
Error: “7b54d8a0f1a64b710058d4408ca4d696_The%20Name%20of%20the%20Wind%2029-92.mp3” couldn’t be moved to “Documents” because either the former doesn't exist, or the folder containing the latter doesn't exist. 

나는이 혼란하고는 ??

"file : /// Users"에 대해 확실하지 않지만이 기능은 찾기에서 작동하지 않으므로 실제 경로 "/ Users"를 사용해야합니다. "file : //"을 어떻게 제거 할 수 있습니까? 문자열의 시작 ??

또한 파일 이름의 공백에 % 20을 추가하는 방법에 대해서는 별다른 옵션이없는 것 같습니다.

답변

1

스레드 문제가 있습니다. "waitUntilFinished"에 대한 귀하의 전체 아이디어가 잘못되었습니다. 메인 스레드를 차단할 수는 없으며 경고 메시지가 나타납니다. 그 경고를 들어라!

getFilePathInBackground을 호출하지 말고 다운로드가 완료 될 때까지 기다리지 마십시오. 대신 블록 안에 getFileInBackgroundWithBlock:을 호출하면 코드의 나머지 부분 즉, 파일을 옮깁니다.

+0

나는 이것을 원래 시도했지만 경로를 반환하지 않으므로 waituntilfinished()와 함께 갔다. 당신은 옳았습니다. 좀 더 자세히 살펴보십시오. document 폴더에 대한 내 생성 된 경로 문제는 파일입니다. // 파일을 잘 이동하면이 파일을 잘 옮깁니다. – WanderingScouse

+0

"하지만 경로를 반환하지 않았습니다."이것은 경로 _into를 넘겨줍니다. – matt

+0

방금 ​​다시 시도했지만 블록으로 넘겨줍니다. 웬일인지 나는 그것을 가지지 않고 있었던 나의 머리에서 그것을 가지고 있었다? – WanderingScouse