XCTest - завершение цикла обработки обработчиком завершения

Я писал тесты XCode, используя XCTest какое-то время, в основном это асинхронные тесты получателей сервиса с обработчиками завершения следующего формата без проблем:

XCTestExpectation *promise = [self expectationWithDescription:@"Get Something should succeed"];

[self.myService getSomethingOnCompletion:^(NSError * _Nullable error) {
    XCTAssertNil(error, @"Error should be nil");
    [promise fulfill];
}];

[self waitForExpectations:@[promise] timeout:2.0];

Внезапно сегодня я иду писать свой первый тест установщика асинхронности в следующем формате, но получаю предупреждения о XCTAssert...() утверждение в блоке, говорящее:

Сильный захват "себя" в этом блоке может привести к сохранению цикла

XCTestExpectation *promise = [self expectationWithDescription:@"Set Something should succeed"];

[self.myService setSomething:@"..." onCompletion:^(NSError * _Nullable error) {
    XCTAssertNil(error, @"Error should be nil");
    [promise fulfill];
}];

[self waitForExpectations:@[promise] timeout:2.0];

Я даже пошел на то, чтобы закомментировать все содержимое setSomething: onCompletion: такой, что он ничего не делает, очищает и перестраивает, но предупреждение все еще сохраняется.

я не понимаю, что self это относится к тому, что единственное, что происходит внутри блока, это XCTAssert...() а также [XCTestExpectation fulfill], Кроме того, я не понимаю, почему ни один из 30+ тестов, которые я написал в первом формате, не имеет связанных с ними предупреждений, но все 5+, которые я написал во втором формате, делают.

Будем благодарны за любые объяснения того, что здесь происходит и как я могу это решить.

(Используя Xcode 10.0)

Изменить 1:

Кажется, проблема связана с именем метода, setSomething: onCompletion:, Меняя его на что-то еще, например doSomething: onCompletion: удаляет предупреждение Я до сих пор не знаю, как / почему XCode интерпретирует set Команда таким образом, что она представляет предупреждение, поэтому любая информация будет оценена.

Изменить 2:

Ниже приведены методы подписи setSomething а также doSomething:

- (void)setSomething:(EnumType)type onCompletion:(SetSomethingCompletionHandler)completion;
- (void)doSomething:(EnumType)type onCompletion:(SetSomethingCompletionHandler)completion

куда SetSomethingCompletionHandler определяется как:

typedef void (^SetSomethingCompletionHandler)(NSError * _Nullable error);

0 ответов

Другие вопросы по тегам