2011-01-21 13 views
7

Hedef, "tablo başlangıcını göstermeden önce verileri yükleyenWillAppear görünümünde bir döndürücü grafiği başlatmak" şeklindedir; böylece kullanıcı, tabloyu görmeden önce neden bir gecikme olduğunu merak etmemektedir. Yani Pencereye bir UIActivityIndicatorView eklenmiştir ve sadece alfa'yı gizlemek/göstermek için ayarlamak istiyorum.Crash - "Collection <CALayerArray: 0x645dfc0>, numaralandırılırken değiştirildi."

Bir iş parçacığı başlatırken, "döndürme dişlileri" görüntü görünümünün (tag = 333) görüntülendiğinden emin olmak için bu garip hatayı alıyorum, viewWillAppear öğesindeki öğeleri yüklemeye/hesaplamaya geçmeden önce.

Her uygulamada [appdel addGearz] ve [appdel removeGearz] için anlamıyorum, bu ikisi için de geçerli ve rastgele. 2 viewWillAppears'dan sonra veya 15'ten sonra olabilir. Alfa'yı ayarlayan satırı açıklarsam her şey çalışır. Tipik bir viewWillAppear şuna benzer

, burada

[super viewWillappear]; 
[email protected]"Products listing"; //and other simple things 
[appdel addGearz]; 
[self getProducts]; 
[self getThumbnails]; 
[myTableView reloadData]; //in case view already loaded and coming back from subview and data changed 

Ve a ve çizgiler

-(void)addGearz { 
    [NSThread detachNewThreadSelector:@selector(gearzOn) toTarget:self withObject:nil]; 
} 

-(void)removeGearz { 
    [NSThread detachNewThreadSelector:@selector(gearzOff) toTarget:self withObject:nil]; 
} 

- (void)gearzOn { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    [window viewWithTag:333].alpha=1.0; 
     // 
     // [[window viewWithTag:333] setNeedsDisplay]; 
    [pool drain]; 
} 

- (void) gearzOff { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    [window viewWithTag:333].alpha=0.0; 
     // 
     // [[window viewWithTag:333] setNeedsDisplay]; 
    [pool drain]; 
} 

dışarı yorumladı değildir ben başkasının kodunu kullandıysanız çöküyor koddur Yani, görebileceğiniz belli bir şey var mı? Elbette UIViews'in alfadaki yerini değiştirebilir miyim? Bazı kodlarda alfa değişimini "değiştirdiğimde" kodlamak zorunda mıyım?

Bu alfa değişim çizgisini havuzun üstüne ya da [havuz süzgecinin] altına taşıyarak çökmemeye başladım, ancak daha sonra pek çok "otoritesiz havuz yokken - yalnızca sızıntı" alıyorum .

Görünüşe göre, bu iş parçacığı koduyla ilgili anlamadığım bir şey var.

cevap

8

Kullanıcı Arabirimini ayrı bir iş parçacığında değiştirmeyi denememelisiniz. UI sadece ana iş parçacığı üzerinde manipüle edilmelidir.

Yeni bir iş parçacığı çıkarmak yerine, performSelectorOnMainThread:withObject:waitUntilDone: kullanmalısınız. Bu, yöntemin uygun iş parçacığı üzerinde çağrılmasını sağlayacaktır.

+0

[self performSelectorOnMainThread: @selector (gearzOn) withObject: nil waitUntilDone: YES]; Görünürlüğü hemen güncellemez, ki bu tüm fikirdir - viewWillAppear, görünüm yüklenmeden önce tüm yüklemesini yapacağı için, kullanıcı bir şeyin olup bittiğinin farkında olmalıdır. –

+0

[window setNeedsDisplay] ile görüntülenmedi; Ya. Ancak bir alfa UIAnimation kullanarak çalıştı. (Hızlı soluma.) Bunun neden işe yaradığı ancak alfanın ayarlanmadığı ve pencerenin güncellenmesini isteyen herhangi bir fikir var mı? Cevabınızı doğru olarak işaretleyecektir, sorunu çözdü. Teşekkürler! –

+0

Sanırım katmanların ekran kuyruğu ve animasyonların ele alınış şekliyle bir ilişkisi var. UIAnimation'ın hile yaptığını bilmek güzel. –