2014-11-20 4 views
0

У меня есть метод (requestData), который можно вызвать несколько раз в моем ViewController, но при первом загрузке ViewController (в методе ViewDidLoad) мне нужно вызвать его два раза, НО второй запрос должен быть отправлен только после того, как первый запрос завершен:отправить второй запрос после первого завершения

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    dataForPlot = 1; 
    [self requestData: dataForPlot]; 

    dataForPlot = 2; 
    [self requestData: dataForPlot]; 
} 

- (void) requestData: (int) forPlot { 
    ... 
    [urlRequest startWithCompletion:^(URLRequest *request, NSData *data, NSError *error, BOOL success) { 

    if (success) { 

     if (forPlot == 1) {  
     ... 
     } 

     else if (forPlot == 2) { 
     ... 
     } 
    } 
} 

Я знаю, что, вероятно, необходимо использовать блоки, но, даже если я пытался читать некоторые учебники, я не знаю, как.

Кто-нибудь может мне помочь?

Спасибо, Corrado

Вот что я реализовал следующие Duncan предложение:

typedef void(^myCompletion)(BOOL); 

- (void)viewDidLoad {  
    [super viewDidLoad]; 
    [self requestData:^(BOOL finished) { // first request 

     if(finished) { 
      NSLog(@"send second request"); 
      [self requestData: ^(BOOL finished) {}]; // second request 
     } 
    }]; 


- (void) requestData: (myCompletion) compblock { 
    ... 
    [urlRequest startWithCompletion:^(URLRequest *request, NSData *data, NSError *error, BOOL success) { 

    if (success) { 
    ... 

    NSLog(@"request completed"); 
    compblock(YES); 
    } 
} 

ответ

0

реорганизовать Метод requestData для принятия блока завершения.

В вашем методе requestData. Когда запрос url завершен, вызовите блок завершения.

В viewDidLoad используйте блок завершения, который вызывает requestData второй раз, на этот раз с пустым блоком завершения.

В других ваших вызовах метода requestData, проходят в блоке завершения ноль (или что-то другое действие, которое необходимо вызвать, когда запрос заканчивается)

+0

Спасибо, я полагаю, это правильное решение, но у меня возникли проблемы с написанием кода (блоки настолько жесткие использовать) ... возможно ли иметь некоторую помощь в реализации вашего предложения? – Corrado

+0

Опубликуйте то, что вы пытаетесь изменить для своего исходного вопроса, а также проблемы, с которыми вы сталкиваетесь. –

+0

Кажется, я наконец нашел что-то, что работает (см. Мой отредактированный вопрос) ... было бы признательно, если бы вы могли подтвердить, что я сделал это правильно. Благодаря ! – Corrado

3

Не называть второй запрос до первых Завершает:

- (void) requestData: (int) forPlot { 
    ... 
    [urlRequest startWithCompletion:^(URLRequest *request, NSData *data, NSError *error, BOOL success) { 

    if (success) { 

     if (forPlot == 1) {  
      ... 
      dataForPlot = 2; 
      [self requestData: dataForPlot]; 

     } 

     else if (forPlot == 2) { 
      ... 
     } 
    } 
} 
+0

Это то, что я уже пытался, но таким образом, каждый раз, когда (не только когда я вызываю его из viewDidLoad), я вызываю метод с помощью forPlot = 1, метод снова вызывается с forPlot = 2. Есть ли еще какое-то другое решение, которое бы избежать этого? – Corrado

+0

Если вы не хотите * всегда * делать это, вы должны использовать решение, предложенное Duncan C. –

Смежные вопросы