2013-02-25 3 views
1

Предположим, у нас есть один UIVewcontroller, назовите его A, в viewdidload этого VC мы добавим к нему два UIViewcontrollers (B, C). Теперь, чтобы сделать UI гладко в Viewdidload А мы делаем некоторые НОД работыGCD, порядок исполнения?

dispatch_queue_t queue = dispatch_queue_create("CustomQueue", NULL); 
    dispatch_async(queue, ^{ 
    // Create views, do some setup here, etc etc 
    // Perform on main thread/queue 
    dispatch_async(dispatch_get_main_queue(), ^{ 
    // this always has to happen on the main thread 
    [self.view addSubview:myview1]; 
    [self.view addSubview:myview2]; 
    [self.view addSubview:myview3]; 
    }); 
}); 

Теперь на основе этого кода, я гарантировал, что мнения будут добавлены в том же порядке? вид 1, затем 2, затем 3?

Я замечаю, что произвольно некоторые взгляды появляются перед другими !!

+0

Да, сначала будет добавлен 'myview1', затем' myview2', затем 'myview3'. – rmaddy

+0

На самом деле, я не замечаю случайный шаблон, большую часть времени он идет по этому заказу, но я замечаю, что другие представления добавляются не в порядок !! – Huang

+1

Пока все вызовы добавления subviews выполняются в основном потоке, тогда не должно быть возможно, чтобы subviews были не в порядке. Методы внутри блока 'dispatch_async' вызываются по порядку, точно так же, как методы будут вызваны нормально. Вы говорите, что эти три взгляда иногда появляются в другом порядке или вы говорите, что иногда разные взгляды смешиваются между этими тремя? – rmaddy

ответ

4

Ваша проблема почти наверняка эта часть:

dispatch_async(queue, ^{ 
    // Create views, do some setup here, etc etc 

Вы не можете сделать что-нибудь вид, связанные с (или на самом деле все UIKit связанные) в фоновом потоке. Период.

+0

Он делает это правильно. Внутри этого фона очередь отправляет блок в основной поток, так что это прекрасно. Единственный способ, которым вы не можете обеспечить порядок выполнения очереди, в том случае, если он является параллельным. Если вам нужны деления (запустите эти блоки, но это должно выполняться только в том случае, если этот другой уже запущен), используйте NSOperationQueue Class и NSOperation (и его подклассы, такие как NSBlockOperation). Эти классы являются абстракцией Grand Central Dispatch, которые работают объектно-ориентированными и используются Apple Framework. –

+1

Нет, его нет. Он создает представления в фоновой очереди –

+0

Пока вы делаете все манипуляции с иерархией представлений в основном потоке, вы можете делать некоторые вещи UIKit в фоновом потоке. Например, можно выполнить [UIGraphicsGetImageFromCurrentImageContext()] (http://developer.apple.com/library/ios/documentation/uikit/reference/UIKitFunctionReference/Reference/reference.html#//apple_ref/c/func/UIGraphicsGetImageFromCurrentImageContext). на фоновом потоке с iOS 4. Идея о том, что UIKit не является потокобезопасной, уже не является строго правдой. –