2013-10-04 3 views
1

동시에 서버에서 일부 정보를 다운로드하고 NSOperatioQueue 같은 사용하고 있습니다. 나는 문제가있다. 예를 들어 다운로드 작업이 어떤 이유로 실패하면 대기열에서 해당 작업을 제거하지 않으려합니다.NSOperation 및 NSOperationQueue

지금 당장 서버에서 응답을 받자 마자 실패합니다. 작업은 대기열에서 제거됩니다.

특정 작업이 논리적으로 완료되지 않고 대기열에 있어야한다는 것을 큐에 알리는 방법이 있습니까?

제 경우에는 일련의 정보를 다운로드하고 있습니다. 예를 들어 카운티의 모든 장소를 가져온 다음 각 카운티의 모든 주택을 가져옵니다. 따라서 사용자가 유효한 토큰으로 로그인하지 않은 경우 카운티를 다운로드 할 수없는 경우가 있습니다. 이 경우 서버는 실패 메시지를 리턴합니다. 사용자가 응용 프로그램에 로그인 할 때 다시 시도 할 수 있도록 대기열에 이러한 항목을 보관하려고합니다.

샘플 코드 downloadQueue는 NSOperationQueue 및 DownloadOutlets입니다

self.downloadQueue.maxConcurrentOperationCount = 1; 
    for(Campaign *campaign in campaigns) 
    { 
     isContentUpdated = false; 
     if(self.operation) 
      self.operation = Nil; 
     self.operation = [[DownloadOutlets alloc] initWithCampaign:campaign]; 
     [self.downloadQueue addOperation:operation]; 
    } 

는 NSOperation을 확장합니다. 감사합니다.

+0

작업을 어떻게 설정합니까? 몇 가지 코드 예제를 보여줍니다. –

+0

무엇을 의미합니까? 성공 또는 실패 여부와 상관없이 모든 코드를 이미 실행 한 경우 대기열에 작업을 유지하는 이유는 무엇입니까? – micantox

+0

제 경우에는 일련의 정보를 다운로드하고 있습니다. 예를 들어 카운티의 모든 장소를 가져온 다음 각 카운티의 모든 주택을 가져옵니다. 따라서 사용자가 유효한 토큰으로 로그인하지 않은 경우 카운티를 다운로드 할 수없는 경우가 있습니다. 이 경우 서버는 실패 메시지를 리턴합니다. 나는 이러한 항목을 대기열에 보관하고 싶습니다. – Zach

답변

1

대기열에 실패한 작업을 유지하면 안됩니다. 실패한 작업이 해당 작업을 수행했습니다. 작업 컨트롤러가 completionBlock 또는 그 밖의 방법을 통해 작업 상태를 청취하고 다음에 수행 할 작업을 결정해야합니다. 작업이 실패했지만 비슷한 작업을 다시 시도해야한다는 결정이 내려지면 작업을 다시 수행하기위한 다른 작업을 추가해야합니다.

또 다른 방법은 성공할 때까지 작업 내에서 다운로드를 다시 시도하고 작업을 끝내는 것입니다. 그러나 작업이 다시 시도할지 여부를 결정하는 데 필요한 모든 정보를 사용자에게 알리지 않아야하므로 최적의 디자인이 아닙니다.

0

대기열에서 실패한 작업을 유지하면 안됩니다. 하지만 시리얼 가져 오는 데이터를 큐를 사용하고 작업이 실패 할 경우 대기 중지 : 다운로드가 성공적으로

@implementation DataAdapter 
// ... 

-(void)setup{ 
    // weak reference to self to avoid retain cycle 
    __weak DataAdapter* selfRef= self; 

    // create a block that will run inside the operation queue 
    void(^pullCountriesBlock)(void)= ^{ 
      [[DownloadManager instance] fetchAllCountriesWithCompletionBlock:^(Result* result){ 
      if(result.successful){ 
       // on success 
       [selfRef didFetchDataForAction:action]; 
      }else{ 
       // on failure 
       [selfRef failedToFetchDataForAction:action]; 
      } 
    }; 

    self.actions= [NSMutableArray new]; 
    [self.actions addObject:[DownloadAction actionWithBlock:pullCountriesBlock]; 
    // add other actions 
    // ... 
    [self fetchData]; 
} 

} 

-(void)fetchData{ 
    if(self.currentActionIndex >= self.actions.count){ 
      [self finishedFetchingData]; 
      return; 
    } 

    [self fetchDataForAction: self.actions[self.currentActionIndex] ]; 
} 

-(void)fetchDataForAction:(DownloadAction*)action 
     [self.myOperationQueueImplementation enqueueOperationWithBlock:action.block]; 
} 

경우, 바로 다음 동작합니다 (currentActionIndex을 증가시키고 fetchData 전화)를 큐에 넣습니다. 실패하면 그에 따라 행동 할 수 있습니다. 내가해야할 일은 fetchData를 처음 호출하기 전에 흥미로운 NSNotificationCenter 이벤트를 듣기 시작하는 것입니다. UserDidLogInNotification 또는 대기열에서 다운로드를 계속 실행할 수있는 다른 것을들을 수 있습니다.

관련 문제