2016-08-05 3 views
0

나는 데이터베이스에서 동적 크기 레코드가 게으른로드 기능을 구축하기 위하여려고하고있다, 그래서 난목표 - C에서 웹 서비스 API에서 응답을받을 때까지 큐 실행을 유지하는 방법

  1. 처음으로 다음에이 일을하고있다 나는 20 레코드를 가져 와서
  2. 다음 사용자의 클릭에 따라 하나, 둘 또는 임의의 수의 레코드를 처리합니다. (사용자가 일부 서비스 호출이나 보류중인 작업을 마칠 때까지 대기하지 않아서 사용자가 목록에서 아무 것도 할 수 없습니다 스크롤 또는 클릭 등)

일관성을 유지하기 위해 먼저 몇 개의 레코드를 먼저 가져온 다음 사용자 레코드를 처리합니다. 여기서 처리 한 레코드는 실제 레코드 목록에서 제거되므로 데이터베이스 및 응용 프로그램의 레코드는 고정 목록이 아닙니다. .

는 나는 다음과 같은 방법으로 지금 당장하고있는 중이 야

: 여기

-(void)viewDidLoad { 
    // Here i fetch first 20 records and then show in UITableView 
    // After user see the list he can click on any button to process that records 
// And i am trying to queue that service call and maintain consistency in records 

} 
-(void)processOneRecord { 
    dispatch_queue_t queue = dispatch_queue_create("com.developer.serialqueue", DISPATCH_QUEUE_SERIAL); 

    dispatch_sync(queue, ^{ 
     // To get further records service call 

     [self getMoreRecordsCompletionBlock:^{ 
      [self ProcessOneRecordServiceCall]; 
     }]; 
    }); 
} 

내가 processOneRecord 방법에서 세포

에 버튼마다 사용자가 클릭을 호출하는 방법 processOneRecord를 작성하고 난 완료 블록을 만듭니다 첫 번째 서비스 호출을 위해 두 번째 서비스 호출은 첫 번째 서비스가 모두 응답 한 후에 실행됩니다. 하지만 이제 사용자가 다른 셀의 버튼을 클릭하면 응용 프로그램에 두 번째 서비스 호출 응답이 반환 될 때까지 첫 번째 서비스 호출을 기다리고 싶습니다.

+0

api 호출을 직렬 방식으로 수행 하시겠습니까? –

+0

예, 직렬 방식으로 API 호출을 수행하고 싶습니다. 그래서 직렬 대기열을 만드는 이유는 무엇입니까? –

+0

첫 번째 API 응답을받은 후 두 번째 API를 호출 하시겠습니까? 화가 난 너에게 대답 해. –

답변

0

응답 주셔서 감사합니다.

Rob의 답을 통해 원하는 기능을 달성했습니다. 나중에 NSOperaiotnQueue에 추가 한 NSBlockOperation을 작성하는 함수를 만들었습니다. 그리고이 함수가 이전에 추가 된 작업이 완료되었는지 여부를 부정 할 때마다, 그렇다면 다른 작업을 추가하십시오. 그렇지 않으면 작업이 완료 될 때까지 이전 작업을 기다립니다.

아래의 코드 스 니펫 변수는 현재 내 UIViewController에 전역 적이며 내 UIViewController의 ViewDidLoad 및 기타 메서드에서 초기화됩니다.

Bool    isRecordProcessed, isLoadMoreCallFinihsed; 
NSOperationQueue *operationQueue; 

-(void)callTwoAPIServiceCalls { 

    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ 
     // To get further records first 

     [self getMoreRecordsCompletionBlock:^{ 
      [self ProcessOneRecordServiceCall]; 
     }]; 
    }]; 

    if (operationQueue.operations.count == 0 && isRecordProcessed && isLoadMoreCallFinihsed) { 
     [operationQueue addOperation:operation]; 
    } 
    else { 
     [self performSelector:@selector(callTwoServiceCalls:) withObject:nil afterDelay:0.1]; 
    } 

}