在第一个请求完成后发送第二个请求

时间:2014-11-20 20:44:39

标签: ios objective-c objective-c-blocks

我有一个方法(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);
    }
}

2 个答案:

答案 0 :(得分: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) {
           ...
       }
    }
}

答案 1 :(得分:0)

重构requestData方法以获取完成块。

在requestData方法中,当url请求完成时,调用完成块。

在viewDidLoad中,使用第二次调用requestData的完成块,这次是一个空的完成块。

在对requestData方法的其他调用中,传入一个nil完成块(或者在请求完成时需要触发的任何其他操作)