2012-09-05 4 views
2

현재 작업중인 앱의 동기화 클래스를 작성했습니다.비동기 데이터 연결 iOS

많은 양의 데이터 때문에 처음에는 데이터 개수를 얻은 다음 NSOperationQueue에 다운로드를 배치합니다. 이 모든 작품이 잘 작동하고 신속하게 동기화 알고리즘을 가지고있어.

작동 방식은 다음과 같이 ...이다

- (void)synchroniseWithCompletionHandler://block for completion handler 
          errorHandler://block for error handler 
{ 
    [self.queue addOperationWithBlock 
    ^{ 
      //Create an NSURLRequest for the first batch 
      //Send the request synchronously 
      //Process the result 
      //If error then cancel all operations in the queue, run errorHandler and return. 
     }]; 

    [self.queue addOperationWithBlock 
    ^{ 
      //Create an NSURLRequest for the second batch 
      //Send the request synchronously 
      //Process the result 
      //If error then cancel all operations in the queue, run errorHandler and return. 
     }]; 

    //Add all the remaining batches. 

    [self.queue addOperationWithBlock 
    ^{ 
      completionHandler(); 
     }]; 
} 

이 작동하고 최대 최소 속도로 메모리 사용량을 유지합니다. 아이디어는 다운로드와 프로세스가 모두 동일한 블록에 있고 둘 다 처리되어 큐의 다음 작업으로 이동한다는 것입니다.

이제는 서버에서 OAuth2를 구현하여 호출을 인증했습니다.

NXOAuth2 라이브러리를 통해 NXOAuth2Request를 설정하여이 작업을 수행했습니다. 그런 다음 계정을 설정하고 서명 된 URL 요청을 철회하십시오. 그런 다음 이전에했던 것처럼이 NSURLRequest를 사용합니다.

문제는 OAuth 토큰이 동기화를 통해 절반 만료되면 동기화가 실패한다는 것입니다.

NXOAuth2 라이브러리는

+ (void)performMethod:(NSString *)aMethod 
      onResource:(NSURL *)aResource 
     usingParameters:(NSDictionary *)someParameters 
      withAccount:(NXOAuth2Account *)anAccount 
    sendProgressHandler:(NXOAuth2ConnectionSendingProgressHandler)progressHandler 
     responseHandler:(NXOAuth2ConnectionResponseHandler)responseHandler; 

이 토큰 새로 고침을 수행 한 후 요청을 다시 전송하여 만기 된 토큰의 상황을 처리 ... 기능이 있습니다.

그러나이 기능은 비동기식이므로 동기화 프로그램에 가장 적합한 방법을 잘 모르겠습니다.

이 작업을 사용하여 작업을 추가 한 다음 처리를 완료 블록에 넣을 수 있습니다. 그러나이 작업을 수행하면 모든 다운로드가 거의 동시에 모두 실행되며 다운로드가 처리되는 순서를 보장 할 방법이 없습니다. 데이터 종속성으로 인해 엄격한 순서로 처리해야합니다.

내가 지금이 일을 생각할 수

있는 유일한 방법은 ... 함께

[NXOAuth2Request performFirstRequest... 
    { 
     deal with the data. 
     [NXOauth2Request performSecondRequest... 
      { 
       deal with the data. 
       [NXOauth2Request performThirdRequest... 
        { 
         deal with the data. 
         finish 
        }]; 
      }]; 
     }]; 

모두-체인 데이지이다 그리고 이것은 단지 지저분하고 아주 지저분한 얻을 수 있습니다.

다른 방법이 있나요 나는 이것을 전혀 처리 할 수 ​​있습니까? 내가 생각할 수있는 유일한 다른 일은 자신을 상쾌하게하려고 노력하는 것입니다.

답변

3

블록을 좋아하지만 동시 NSOperations에서 가장 잘 수행되는 작업이 있습니다. gthub에 really simple really easy to adopt project을 넣고 저장소에있는 내 앱에서 사용하는 것과 동일한 파일을 사용하여 데이터를 가져와 처리합니다. 이 전략을 작업에 쉽게 적용 할 수 있습니다.

  • 웹 페치를 수행하는 기본 동시 작업으로 시작하여 데이터를 가져옵니다.서브 클래스와
  • 당신은 당신이 그것을
  • 사용할 수있는 어떤 논리 이내에 인증을 통합 할 수 있도록, 그것은 메시지를 기다리는 자신의 runloop 차단할 수있다 의미의 동시 이후
  • 다른 방식으로 데이터를 처리 할 수 원하는 경우 - 중간에 인증 실패가 발생하면 권한 요청을 취소하고 한 번에 다른 작업을 수행 할 수 있습니다.
  • 한 번에 하나 이상의 활성을 가질 수 없도록 작업을 연결할 수 있습니다.

나는이 구조체를 모든 웹 상호 작용, 그리고받은 데이터에 대해 서로 다른 유형의 처리를 수행하는 30 개의 하위 클래스와 같은 것이 있습니다.

이 프로젝트는 세 가지 기본 클래스가 있습니다

  • OperationsRunner - NSOperationsQueue에

  • ConcurrentOperation을 높은 수준의 인터페이스를 제공하는 정말 작은 클래스 - 최소한의

  • WebFetcher -을 NSURLConnection을 실행하고 수행 할 때 완료하는 클래스

다른 하위 클래스는 데이터를 처리하기위한 "완료"메소드 만 제공하면됩니다.

+0

네, NSOperation 서브 클러킹을 생각하지 않았습니다. (TBH는 결코 전에 제대로 해냈다). 또한 NSOperation 내에서 비동기 호출도 차단할 수 있다는 것을 깨닫지 못했습니다. 고마워, 좀 봐. – Fogmeister

+0

github 프로젝트에 대한 링크를 추가 할 수 있습니까? 감사합니다 – Fogmeister

+0

완료 - 그것의 편집 된 대답 –