Представьте, что вы реализуете метод в терминах нескольких других методов:
-(BOOL)sendCachedRequestReturningError: (NSError**)err {
BOOL success = [self readCachedRequestReturningError:err];
if (!success && (*err).domain == MYFileDomain && (*err).errorCode == MYFileNotFoundCode) {
success = [self sendUncachedRequestReturningError:err];
}
return success;
}
Теперь здесь есть 4 пути кода:
- Есть кешированный запрос. Мы просто вернемся
success == YES
и все хорошо.
- При попытке чтения из кэша возникает неисправимая ошибка.
readCachedRequestReturningError:
установит err
и установит success == NO
, и вызывающий абонент вызовет presentError:
или что-то еще
- Произошла ошибка при попытке выполнить сетевой запрос. То же, что # 2,
err
установлено и success == NO
.
- Кеша нет, но мы можем сделать сетевой запрос.
readCachedRequestReturningError:
установит err
в действительное значение NSError{MYFileDomain, MYFileNotFoundCode}
, но затем sendUncachedRequestReturningError:
выполнится успешно и установит success == YES
, а не коснется err
вообще, оставив в нем предыдущую ошибку. Если вы теперь проверите err
вместо проверки возвращаемого значения, вы будете думать, что произошла ошибка, когда все прошло хорошо.
Примечание: приведенный выше код сильно упрощен, потому что мы заботимся только об ошибках. Конечно, в реальной программе методы могут иметь другой возвращаемый параметр для фактического ответа на запрос или возвращать ответ или nil
вместо success
BOOL
. Это также, вероятно, проверит, является ли err
1034 *.