3

나는 수행하여 UIActivityViewControllerNSURL를 제공하기로하는 UIActivityItemProvider 서브 클래스를 가지고 다음과 같은 : UIActivityItemProvider의 -item 메서드 : NSURLConnection을 기다리고 있습니까?

  • 가 제공하는 서버에서 URL을 수신

    • 내 서버
    • 에 이미지를 업로드 공유자에 대한 URL.

  • 그것은 이론적으로 매우 간단 보였다 : 더미 NSURL을 반환 placeholderItem 방법을 설정 한 다음 item 방법 등 업로드를 처리하는 모든 로직을 설정합니다.

    문제는 item 메서드가 백그라운드 스레드에서 호출되고 모든 처리를 처리하고 항목 (이 경우 NSURL)을 반환하는 것으로 가정되는 단일 동기 메서드 인 것입니다. 그리고 메서드 업로드를 처리하는 데 비동기 적으로 사용해야합니다 (즉, 보조자로 UIActivityItemProvider 하위 클래스가있는 NSURLConnection을 만들고 대리자 메서드에 응답하여 진행률 표시기로 UI를 업데이트하는 등 ...) item 메서드 내에서 수행하십시오. item의 URL이 반환 될 때까지 반환 할 수 없기 때문에

    내 시도는 item 메서드를 트리거하는 것이 었습니다. URL에 연결이 다음이 루프에 뛰어 :

    while ((self.uploadedFileURL == nil) && (self.uploadErrorMessage == nil)) { 
         [NSThread sleepForTimeInterval:1.0f]; 
         NSLog(@"Waiting for upload..."); 
        } 
    

    을 한 후 나는 didFinishLoadingdidFailWithError 대리자 메서드에서 등 진행 상황을 업데이트하기 위해 다양한 NSURLConnection 위임 방법에 의존, 나는 각각 self.uploadedFileURLself.uploadErrorMessage, 값을 제공합니다.

    하지만 이것은 작동하지 않습니다. NSURLConnection은 절대 위임 메서드를 실행하지 않으며 어떤 이유로 든 차단되었다고 가정해야합니다. 나는 "기다리는 중 업로드를 기다리고 있습니다 ..."라는 메시지가 매 초마다 예상되지만, 그 밖의 일은 발생하지 않습니다.

    무엇이 여기에 있습니까?

    업데이트 : 일종의 솔루션을 찾았지만 이상적이지 않습니다. -item 메서드에서 동기 요청을 사용합니다. 큰 단점은 진행률 표시기를 표시 할 수 없으며 네트워크 오류를 제대로 처리 할 수 ​​없다는 것입니다. 그래서 ... 더 나은 방법을 찾고 있습니다.

    답변

    1

    좋아, 그럼 나는 아주 좋은 해결책을 발견했다. 이 동 기적으로 그 값을 반환 제공하는 방법에

    https://gist.github.com/SQiShER/5009086

    "의사 - 동기"하지만 백엔드에서 비동기 방식을 사용하는 다음 요지가있는 NSURLConnection 방법 의사 동기 변이체를 제공한다.나는 그것이 정말로 합법적 인 용어는 아니지만, 내가 가진 전부라고 확신한다.

    어쨌든, 링크의 코드는 일부 nsurlconnection 대리자 메소드에 응답하지만 ... 더 많은 것을 추가하는 것은 간단하다. 그래도. 누군가가 이것을보고 좀 더 자세한 내용을 원한다면, 나는이 대답을 살피는 데 시간을 할애 할 것입니다.

    +0

    더 자세히 설명해 주시겠습니까? – Suran

    +1

    @Suran 2 년 전부터 이것은 내 기억에 새롭지 않습니다. 가장 좋은 조언은 제가 연결 한 요지를 살펴 보는 것입니다. 이 코드는 비동기 요청이 완료 될 때까지 루프에서 대기 한 다음 반환하는 동기 메서드를 제공합니다. 즉, 호출자에게는 이러한 메서드가 실제로 비동기 메서드를 호출하여 임무를 수행하더라도 완전히 동기식으로 나타납니다. – DanM

    +0

    답장을 보내 주셔서 감사합니다. 마지막으로 나는 비슷한 접근법만을 사용하여 끝내었다. 건배! – Suran

    0

    UIActivity 하위 클래스를 대신 사용해 볼 수 있습니다. -[UIActivity performActivity]을 무시하고 거기에서 다운로드를 시작하십시오. 완료되면

    [self activityDidFinish:YES]; 
    

    을 계속 사용하십시오.

    +1

    문제는 iOS8에서 다른 응용 프로그램의 공유 확장에 적용하려면이 동작이 필요하다는 것입니다. 이해하기 가장 좋은 점은 UIActivities처럼 서브 클래 싱 할 방법이 없다는 것입니다 (클래스에 액세스 할 수 없기 때문에) ... 나는 여기에 또 다른 적극적인 질문을한다. 특정 공유자를 내 자신의 변종 (또는 다른 메커니즘)으로 대체 할 방법이 있는지 묻는다. 그러나 만약이 * 솔루션 작업을하려고한다면, 내가하고있는 일은 UIActivity 자체에 접근 할 필요가 없다. – DanM

    +0

    알겠습니다. 나는 너의 질문의 요점을 완전히 놓쳤다. – orkoden