NSError ** выдаёт назад размножение в вызове с несколькими функциями

Облицовка проблемы при обратном распространении ошибки в многофункциональном вызове.

Например,

NSError *error = nil;
EMSPlanFolder *planner = [[EMSPlanFolder sharedPlanBuilder] buildPlanFromParsePlan:plan withError:&error];
if (error) {
   //error
}

Затем он переходит в функцию:

- (EMSPlanFolder*)buildPlanFromParsePlan:(EMParsedPlan*)parsedPlan withError:(NSError *__autoreleasing*)err
{
 ....
 ....
 [self deserializePlan:parsedPlan forPlan:newPlanFolder allowingNoEndDate:NO withError:err];
  if(err && *err) {
   [newPlanFolder.managedObjectContext performBlockAndWait:^{
 [EMSPlanFolder deletePlan:newPlanFolder];
    }];
  return nil;
  }
 return newPlanFolder;
}

Затем он переходит к следующему пункту:

   - (void)deserializePlan:(NSArray*)planElements forPlan:(LMSPlanFolder*)planFolder allowingNoEndDate:(BOOL)allowNoEndDate withError:(NSError *__autoreleasing*)err {
     ....
     ....
     if(err) {
      *err = [NSError errorWithDomain:@"Application" code:-1 userInfo:@{ NSLocalizedDescriptionKey:[NSString stringWithFormat:@"Plan was not found."]}];
     }
     return;
    }

Проблема в том, что она приводит к сбою, когда она обратно распространяется на первый фрагмент кода. Любые предложения по этому поводу

Ответ 1

Попробуйте следующее:

NSError *error = nil;
EMSPlanFolder *planner = [[EMSPlanFolder sharedPlanBuilder] buildPlanFromParsePlan:plan withError:&error];
if (error) {
   //error
}

- (EMSPlanFolder*)buildPlanFromParsePlan:(EMParsedPlan*)parsedPlan withError:(NSError **)err
{
 ....
 ....
 [self deserializePlan:parsedPlan forPlan:newPlanFolder allowingNoEndDate:NO withError:&err];
  if(err == nil) {
   [newPlanFolder.managedObjectContext performBlockAndWait:^{
 [EMSPlanFolder deletePlan:newPlanFolder];
    }];
  return nil;
  }
 return newPlanFolder;
}

- (void)deserializePlan:(NSArray*)planElements forPlan:(LMSPlanFolder*)planFolder allowingNoEndDate:(BOOL)allowNoEndDate withError:(NSError **)err {
     ....
     ....
     if(err) {
      *err = [NSError errorWithDomain:@"Application" code:-1 userInfo:@{ NSLocalizedDescriptionKey:[NSString stringWithFormat:@"Plan was not found."]}];
     }
     return;
}

Ответ 2

Рамки Apple часто выполняют блоки во вложенных пулах автозапуска. Ваша ссылка на ошибку является автореализацией, и, таким образом, ошибка выдается, когда блок завершил выполнение. Чтобы избежать этого, используйте сильную локальную переменную __block, чтобы сохранить ошибку. Попробуйте что-то вроде этого:

__block NSError *theError = nil;

[context performBlockAndWait:^{
     //
    [self deserializePlan:parsedPlan 
                  forPlan:newPlanFolder 
        allowingNoEndDate:NO 
                withError:&theError]; // <- store the error ARP safe
}];
*err = theError;