Обратный вызов блока изнутри блока - PullRequest
0 голосов
/ 23 мая 2018

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

Например:

typedef void(^SomeBlock)(int someValue);
typedef void(^SomeOtherBlock)(int someOtherValue, SomeBlock originalBlock); // how would you pass SomeBlock?


- (void)getSomeValue:(SomeOtherBlock)completionBlock {
  [self someMethod:^(int someValue){
    // How could I call SomeOtherBlock & pass back SomeBlock?
    int someOtherValue = 2;
    // I.e, completionBlock(someOtherValue, SomeBlock);
  }];
}
- (void)someMethod:(SomeBlock)completionBlock {
  completionBlock(1);
}

Вот чтоЯ получил, но это выглядит действительно ужасно:

- (void)getSomeValue:(SomeOtherBlock)completionBlock {
  [self someMethod:^(int someValue) {
    int someOtherValue = 2;
    SomeBlock someBlock = ^(int innerVal) {
      innerVal = someValue;
    };
    completionBlock(someOtherValue, someBlock);
  }];
}
- (void)someMethod:(SomeBlock)completionBlock {
  completionBlock(1);
}

Короче говоря, цель состоит в том, чтобы выполнить первый блок и проанализировать обратный вызов из этого блока.Затем передайте первый блок в качестве параметра второму блоку.

1 Ответ

0 голосов
/ 24 мая 2018

Ответ на заданный вопрос очень прост, но я подозреваю, что на самом деле это не ваш вопрос.Ничто в вашем вопросе не предполагает асинхронного поведения, но вы продолжаете говорить «блок завершения».Получение результатов от неасинхронных блоков - это просто вопрос возврата их результата:

// SomeBlock takes an int and returns an int
// (In your example you have it return void, but then what is "analyzed?"
typedef int(^SomeBlock)(int someValue);

// SomeOtherBlock takes an int and also a SomeBlock
typedef void(^SomeOtherBlock)(int someOtherValue, SomeBlock originalBlock);


void executeAnalyzeAndContinue(SomeBlock firstBlock, SomeOtherBlock secondBlock, int value) {
    // execute the first block
    int result = firstBlock(value);

    // and analyze the callback (return value?) from that block. 
    if (result == 2) { NSLog(@"%@", @"It was two"); }

    // Then, pass the first block as a parameter to the second block (and also a value?)
    secondBlock(result, firstBlock);
}

Это действительно то, что вы имеете в виду?(Я подозреваю, что создание этого конспекта с использованием «некоторого блока» и тому подобного делает его гораздо более сложным, чем на самом деле, и что вы действительно хотите задать некоторый связанный вопрос, а не этот. И я думаю, что вы имеете в виду «выполнить», когда высказать "осуществить".)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...