0

Ich brauche Hilfe. Ich schreibe App, die Daten speichern und gleichzeitig zeigen soll. Aber ich habe ein Problem. Beide Operationen funktionierten nur in der Hauptwarteschlange. Was ich tun kann? Vielen Dank!Arbeit mit Sqlite und UI-Aktion in der Hauptwarteschlange

Mein UI-Code

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.hostView.hostedGraph reloadData]; 
}); 

Mein DB-Code

-(BOOL)addNewMesurable:(Mesurable*)mesurable{ 
    if (!_database) [self createDatabase]; 
    const char *charDBpath = [_dbPath UTF8String]; 
    if (sqlite3_open(charDBpath, &_database) == SQLITE_OK) { 
     char* errorMessage; 
     sqlite3_exec(_database, "BEGIN TRANSACTION", NULL, NULL, &errorMessage); 

     NSString *query = 
     [NSString stringWithFormat:@"insert into %@ (value , date, time) values (? , ? , ?)",[Sensor sensorNameToString: 
mesurable.sensor]]; 
     sqlite3_stmt *statement; 

     if (sqlite3_prepare_v2(_database, [query UTF8String], -1, &statement, NULL) == SQLITE_OK) { 

      sqlite3_bind_text(statement, 1, [[mesurable.value stringValue] UTF8String], -1, NULL); 
      sqlite3_bind_text(statement, 2, [[mesurable getStrindDate] UTF8String], -1, NULL); 
      sqlite3_bind_text(statement, 3, [[mesurable getStrindTime] UTF8String], -1, NULL); 
      // 
      if(sqlite3_step(statement) != SQLITE_DONE){ 
       NSLog(@"ERROR add data from sensor - %@ ", [Sensor sensorNameToString: mesurable.sensor ]); 

      } 
      else NSLog(@"Done"); 
      sqlite3_clear_bindings(statement); 
      sqlite3_reset(statement); 
      sqlite3_exec(_database, "PRAGMA synchronous = OFF", NULL, NULL, &errorMessage); 
      sqlite3_exec(_database, "PRAGMA journal_mode = MEMORY", NULL, NULL, &errorMessage); 
     } 
     sqlite3_exec(_database, "COMMIT TRANSACTION", NULL, NULL, &errorMessage); 
     sqlite3_finalize(statement); 
     sqlite3_close(_database); 
    } 

    return YES; 
} 

Antwort

0

try this:

Sie DISPATCH_QUEUE_PRIORITY_LOW verwenden können, _Hohe und _DEFAULT:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 
    // now send the result back to the main thread so we can do 
    // UIKit stuff. u can update ur ui 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // update your DB content 
    }); 
});