Как решить ошибку при использовании потока? - PullRequest
8 голосов
/ 06 января 2011

У меня появляется следующее сообщение об ошибке в консоли при использовании 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" - это метод загрузки данных из 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;

    }

Ответы [ 5 ]

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

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

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

Документация по использованию потоков в приложениях iOS довольно обширна.

2 голосов
/ 27 сентября 2011

Ваша проблема должна возникать, потому что вы загружаете свой 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];
}
0 голосов
/ 06 января 2011

Попробуйте изменить метод 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

0 голосов
/ 06 января 2011

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

Всего наилучшего.

0 голосов
/ 06 января 2011

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

потому что

Вы не можете поместить любую вещь, которая имеет отношение к вашему ВИДУ в теме ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...