2011-01-06 25 views
8

NSThread kullanırken konsolda aşağıdaki hata mesajını takip ediyorum "Web kilidi ana iş parçacığı veya web iş parçacığı dışında bir iş parçacığından almak için denendi. Bu, ikincil bir iş parçacığından UIKit çağrısının sonucu olabilir. .."İş parçacığı kullanırken hata nasıl çözülür?

benim burada örnek kod burada

- (void)viewDidLoad { 

    appDeleg = (NewAshley_MedisonAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    [[self tblView1] setRowHeight:80.0]; 
    [super viewDidLoad]; 
    self.title = @"Under Ground"; 


    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 
    [NSThread detachNewThreadSelector:@selector(CallParser) toTarget:self withObject:nil]; 

} 

-(void)CallParser { 


    Parsing *parsing = [[Parsing alloc] init]; 
    [parsing DownloadAndParseUnderground]; 

    [parsing release]; 
    [self Update_View]; 
    //[myIndicator stopAnimating]; 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 




} 

göndermesini "DownloadAndParseUnderground" rss feed verileri downloding yöntemi ve

-(void) Update_View{ 


    [self.tblView1 reloadData]; 
} 

wh olduğunu tr Update_View yöntemi tableView Eğer yöntemini ayrıştırılırken iplik gerektiren Neden doğru açıklamak Verileri yeniden yüklemek ve cellForRowAtIndexPath hatayı oluşturma ve özel hücreyi

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 


    static NSString *CellIdentifier = @"Cell"; 

    CustomTableviewCell *cell = (CustomTableviewCell *) [tblView1 dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 

     [[NSBundle mainBundle] loadNibNamed:@"customCell" 
             owner:self 
            options:nil]; 

     cell = objCustCell; 
     objCustCell = nil; 

    } 
+0

sizin asenkron yükleme "performSelectorOnMainThread" daki kodu (aşağıda yorumladı) 2.Change sadece bir param

-(void)pushViewController:(UIViewController*)theViewController{ [self.navigationController pushViewController:theViewController animated:YES];} 

ile viewcontroller yüklemek için bir yöntemi ekleyin, neden? – BoltClock

+1

Cevapları okumak, çünkü her ikisinin de yanlış (ya da bölünemez - 'u her şeyin üstünde olan nedir?!?). – bbum

cevap

0

lütfen tamam göstermez denir? Kodunuzdaki u

u sadece arka plan sürecini koyabilirsiniz ... u iplik daki GÖRÜNÜM için relavent herhangi bir şey koyamazsınız

çünkü .... düzgün dizisindeki tablo yeniden yöntemi kullanmak eğer ayrıştırmadan sonra tabloyu yeniden yüklemek isterseniz u kodlamadan sonra tabloyu yeniden yükleyebilirseniz ve kod yüklediğinizde ve u yük tablosunu ayrıştırmadan sonra

-1

Herhangi bir UI öğesine arka plan iş parçacığından erişemezsiniz. Bir arka plan iş parçacığı üzerinde kesinlikle görünümler oluşturamazsınız. "DetachNewThreadSelector" yöntemi yerine "performSelectorOnMainThread" yöntemini kullanın.

En iyisi. Bir kilitlenme varsa

3
  • , bir backtrace yoktur. Lütfen yayınla.

  • Yöntem isimleri, küçük harfler ile başlayan camelCased vardır ve alt çizgilerden yoktur. Bu düzenleri ardından diğer iOS programcıları tarafından okunması ve bu kuralları öğrenerek daha kolay Diğer iOS programcının kodu anlamak yapacaktır kodunuzu daha kolay hale getirecek.

Doğrudan veya dolaylı olarak, ana iş parçasındaki yöntemleri arka plan iş parçacıklarından çağıramazsınız. Kilitlenme durumunuz ve kodunuz, ana iş parçacığı olmayan ana iş parçacıklarıyla serbestçe etkileşim kurduğunuzu gösterir.

documentation on the use of threads in iOS applications oldukça kapsamlıdır.

0

deneyin değişim CallParser yöntemi

-(void)CallParser { 

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    Parsing *parsing = [[Parsing alloc] init]; 
    [parsing DownloadAndParseUnderground]; 

    [self performSelectorOnMainThread:@selector(Update_View) 
          withObject:nil 
         waitUntilDone:NO]; 
    [parsing release]; 
    [pool release]; 
} 

Ve taşımak

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 

hat Update_View yöntemine

2

ana iş parçacığı değil bir iş parçacığı adresinin UIViewController yüklemek çünkü sorunun gelmelidir . Görünümü yüklemeden önce verileri şarj etmeye çalıştığınızda genel olarak. Bu düzenlemek için bu 1 yapmak deneyebilirsiniz.Her iki cevaplar downvoted edildi

-(void)asyncLoadMyViewController 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    MyViewController *myVC = [[myVC alloc] initWithNibName:@"myVC" bundle:nil ]; 
    [self performSelectorOnMainThread:@selector(pushViewController:) withObject:myVC waitUntilDone:YES]; 
    //  [self.navigationController pushViewController:wnVC animated:YES]; 
    [wnVC release]; 
    [pool release]; 
} 
İlgili konular