При использовании методов, которые возвращают блоки, они могут быть очень удобными. Тем не менее, когда вам нужно объединить несколько из них, это быстро становится беспорядочным.
например, вы должны вызывать 4 URL-адреса подряд:
[remoteAPIWithURL:url1 success:^(int status){
[remoteAPIWithURL:url2 success:^(int status){
[remoteAPIWithURL:url3 success:^(int status){
[remoteAPIWithURL:url2 success:^(int status){
//succes!!!
}];
}];
}];
}];
Итак, для каждой итерации я иду на один уровень глубже, и я даже не обрабатываю ошибки во вложенных блоках.
Ухудшается, когда есть реальный цикл. Например, скажем, я хочу загрузить файл в 100 кусков:
- (void) continueUploadWithBlockNr:(int)blockNr
{
if(blocknr>=100)
{
//success!!!
}
[remoteAPIUploadFile:file withBlockNr:blockNr success:^(int status)
{
[self continueUploadWithBlockNr:blockNr];
}];
}
Это кажется очень неинтуитивным и очень быстро читается.
В .Net они решили все это, используя ключевое слово async и wait, в основном разворачивая эти продолжения в кажущийся синхронный поток.
Какова наилучшая практика в Objective C?