2011-11-03 27 views
8

Ben veriler içeren bir UITableViewController yüklemek için twitter hesaplarının bir listesini almaya çalışıyorum. Bu fonksiyonu kullanmak: Nedense(iOS 5), TableView kapatır?

- (void)viewDidLoad { 
    [accountStore requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) { 
     ... 
     [[self tableView] insertRowsAtIndexPaths ...]; 
     [[self tableView] reloadData]; 
     NSLog("This message appears immediately"); 
     ... 
    }]; 
    NSLog("This message appears immediately"); 
} 

, arayüz aslında/yeniden çizilir güncellenir masanın önce 5 saniye boyunca "askıda" gibi görünüyor (reloadData çağırarak AM unutmayın!). Tüm günlük iletilerim hemen yazdırılıyor, bu yüzden arabirimin donmasına neden olan şeyden emin değilim.

cevap

16

Tümü,

Yani, (bir çeşit) anladım. Sanırım iş parçacığıyla bir ilgisi var, bu iş parçasında herhangi bir kullanıcı arayüzü yapmam gerekiyordu.

düzeltmek için, size bazı sevk koduyla masa şeyler çevrili:

[account requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) 
{ dispatch_async(dispatch_get_main_queue(), ^{ 
    ... 
});}]; 

Hala burada oluyor ama birisi aynı sorun haline çalışıyorsa umarım bu yardımcı olacaktır anlamak gerekir.

+0

mesele UI çağrıları ana iş parçacığı üzerinde olmak zorunda olması ve '-requestAccessToAccountsWithType: withCompletionHandler:' tamamlanma blok ana iş parçacığı üzerinde çağrılıp olacağını garanti etmez. Eğer kullanıcı arayüzü o zaman 'dispatch_async' aramadan önce arka plan kuyrukta bunu serbestçe yapabilirsiniz çağırmadan önce yapmak için daha fazla işleme varsa gerçi dispatch_async'' kullanımınız, burada doğrudur. –

+0

Teşekkürler dostum, başka bir görüş gecikme ile aynı sorunu vardı. Bu benim için çözdü. withObject: waitUntilDone: – thgc

+2

Apple'ın örnek kod performSelectorOnMainThread kullanan işleyicisi yöntemi keyfi bir kuyruğa üzerinde gerçekleştirilen gerçeği ile başa çıkmak için. – sam