Сбой приложения из-за вторичного потока, пытающегося обновить пользовательский интерфейс - PullRequest
0 голосов
/ 05 мая 2011

Я использую панель поиска для выбора записей из таблицы, которая заполнена Sqlite DB.Развертывание таблицы в каждых 120 записях и перезагрузка таблицы в каждых 200 записях.Мои приложения аварийно завершают работу, когда я перетаскиваю таблицу до предела. Когда определенный предел покрывается. Вылетает с ошибкой «дополнительный поток пытается обновить интерфейс». Вот код

 if (indexPath.row > limit)
    {
        llimit = llimit+200 ;
        ulimit = ulimit+200 ;
           NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        [opq cancelAllOperations];
        NSLog(@"before ns operation");
        opq = [NSOperationQueue new];
        NSInvocationOperation *op = [[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(searchData) object:nil] autorelease];
        [opq addOperation:op];
        [pool drain];
        i++;
        limit = limit + 120 ;
    }



- (void) searchData {

    NSString *databaseName = @"imeating.sql";
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
    NSString *documentsDir=[documentPaths objectAtIndex:0];
    NSString *databasePath=[documentsDir stringByAppendingPathComponent:databaseName];
    sqlite3 *database;

    if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)
    {
        // Setup the SQL Statement and compile it for faster access
        sqlite3_stmt *compiledStatement ;
        const char *sqlStatement ;

        sqlStatement = "select category_id, upper(subitem_name), subitem_detail_id from subitem_detail where subitem_name LIKE ? order by subitem_name limit ?,?" ;
       NSLog(@"inside search b4 wildsearch %@",searchString);

        wildSearch = [NSString stringWithFormat:@"%@%@",searchString, @"%"];



        if (sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) 
        {

            sqlite3_bind_text(compiledStatement, 1, [wildSearch UTF8String], -1, SQLITE_TRANSIENT);
            sqlite3_bind_int(compiledStatement, 2, llimit);
            sqlite3_bind_int(compiledStatement, 3, ulimit);

            if (llimit <200){
                 NSLog(@"with in if limit < 200");

                itemArray = [[NSMutableArray alloc] init] ;
            }

            while (sqlite3_step(compiledStatement) == SQLITE_ROW) {


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

                NSString *categoryId = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];
                NSString *itemName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
                NSString *itemId = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)];

                if (ulimit%200 == 0)
                {

                    [newTableView reloadData];


                }
                [pool drain];
            } 


        }
    }

Это происходит на устройстветолько не в симуляторе и ленивая загрузка происходит в табличном представлении.Я использую базу данных sqllite (содержит огромное количество данных) для заполнения таблицы.Я могу перетащить таблицу к определенному диапазону пределов, после чего происходит сбой приложения. Предел сбоя не является постоянным. Пожалуйста, помогите мне реализовать это идеально

Заранее спасибо

1 Ответ

3 голосов
/ 05 мая 2011

Вы не можете обновить пользовательский интерфейс во вторичном потоке, если вам нужно обновить пользовательский интерфейс, используйте -

[self performSelectorOnMainThread:@selector() withObject:nil waitUntilDone:YES];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...