2011-01-06 5 views
8

У меня есть следующая ошибка: msg в консоли при использовании NSThread «Пытался получить веб-блокировку из потока, отличного от основного потока или веб-потока. Это может быть результатом вызова UIKit из вторичного потока. ..»как решить ошибку при использовании потока?

меня отправить свой образец кода здесь

- (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; 




} 

здесь "DownloadAndParseUnderground" является метод Downloding данные из канала RSS и

-(void) Update_View{ 


    [self.tblView1 reloadData]; 
} 

белый Метод ан Update_View называется Tableview перезагрузки данных и в cellForRowAtIndexPath создает ошибку и не отображать пользовательскую ячейку

- (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

Оба ответа были downvoted, почему? – BoltClock

+1

Читая ответы, это потому, что оба они ошибаются (или непревзойденно - что происходит с «u на всем протяжении?!?). – bbum

ответ

0

нормально, пожалуйста, объясните почему собственно вам требуется нить в методе разбора? в коде и использовать метод перезагрузки таблицы в должным образом в потоке ....

потому что

и не может поставить любую вещь, которая relavent вашего взора в теме ...

и может поставить только фоновый процесс например, синтаксический анализ в нем ... если вы хотите перезагрузить таблицу после разбора, вы можете использовать некоторое значение флага в вашем коде и после разбора таблицы загрузки

-1

Вы не можете получить доступ к элементам пользовательского интерфейса из фонового потока. Вы, конечно же, не можете создавать представления в фоновом потоке. Используйте метод «performSelectorOnMainThread» вместо метода «detachNewThreadSelector».

Все самое лучшее.

3
  • если есть авария, есть обратная линия. Пожалуйста, опубликуйте его.

  • Названия методов начинаются строчными буквами, являются camelCased и не содержат знаков подчеркивания. Следуя этим соглашениям, ваш код будет легче читать другими программистами iOS, и изучение этих соглашений облегчит понимание кода другого программиста iOS.

Вы не можете прямо или косвенно ссылаться на методы в основной теме из фоновых потоков. Ваша авария и ваш код указывают на то, что вы свободно взаимодействуете с основной нитью, не являющейся основной нитью.

documentation on the use of threads in iOS applications довольно обширна.

0

Try метод изменения CallParser к

-(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]; 
} 

И двигаться

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 

линии методом Update_View

2

Ваша проблема должна прийти, потому что вы загрузили UIViewController из потока, что это не основной поток , При попытке зарядить данные перед загрузкой представления. Для этого вы можете попробовать это сделать 1.Добавьте метод для загрузки вашего ViewController только с одним парами

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

2.Изменения коды (комментировали ниже) в асинхронных загрузках в «PerformSelectorOnMainThread»

-(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]; 
} 
Смежные вопросы