2014-12-19 3 views
-1

Я унаследовал кодовую для проекта IOS и мне интересно, что смысл этого кода:Bizarre Objective-C резьб

-(void) someMethod { 
     FMDatabaseQueue *dbQueue = self.db; 
    // unimportant stuff 
    [Async series:@[ 
     ^(successBlock success, failureBlock failure) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [dbQueue inDatabase:^(FMDatabase *db) { 
       // do database stuff 
      }]; 
     }); 
     }, 
     ^(successBlock success, failureBlock failure) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [dbQueue inDatabase:^(FMDatabase *db) { 
       // do other database stuff 
      }]; 
     }); 
     } 
    ];  
} 

Есть ли причина, чтобы закодировать что-то вроде этого?

Мое мнение, что Async и dispatch_async() назад к основной резьбе делает резьбу бессмысленной.

+0

Это не делает его бессмысленным: Async может выполнить некоторый код в фоновом режиме, а затем вызвать блок завершения, который что-то делает в основном потоке. Независимо от того, что делает Async, может потребоваться значительное количество времени ... – fabian789

ответ

1

Код странный, но не из-за этого. Метод +series, вероятно, делает что-то в фоновом режиме (сеть, вычисление, $ безотносительно), а затем вызывает последовательные блоки. Выполнение этих блоков, похоже, не гарантируется в основном потоке. Но +series не могут знать, должны ли они выполняться по основному потоку. (Возможно, есть дополнительные вычисления, которые должны выполняться в фоновом режиме. Возможно, блоки выполняются параллельно.)

Итак, если что-то сделано, что должно быть сделано в основном потоке, вам нужен еще один dispatch_async().

Но да: вы получаете такие созвездия, когда люди пытаются делать все, используя блоки, не думая о необходимости. Я не знаю, почему это происходит, но, используя блоки, многие кодеры пытаются переопределить свой код.

+0

amen, но да часть: D –

+0

Немного больше информации: «Async» - это cocoapod, описанный автором как «набор функций для работы с асинхронными блоками в Objective-C «. '+ series' гарантирует, что блоки выполняются в том порядке, в каком они появляются в массиве. Я не верю, что «Async» делает что-либо, кроме асинхронной очереди блоков. – Pigglesworth

+0

Когда я вижу код, который имеет метод класса для выполнения простой, независимой функции, большую часть времени я закрываю окно. Разве автор не знает, что в Objective-C все еще есть функции? Ни классы, ни объекты класса не являются модулями. Это типы и объекты. –