2016-07-08 3 views
0

Ich habe Tabellenansicht, die neue Daten (abhängig von der Seite) aus der SQL-Datenbank laden. Problem ist, wenn ich es im Hauptthread lade, blockiere es UI für eine Weile. Wenn ich versuche, "harte Arbeit" im Hintergrund zu tun und Daten im Hauptthread neu zu laden, beginnen seltsame Dinge zu passieren, zum Beispiel bewegen sich die Kopfzeilen des Tabellenansichtsabschnitts an falscher Stelle, und ich lade enorme Datenmengen.Neue Elemente in die Tabellenansicht hochladen

Erster Fall, alle Arbeit, aber Block UI für während:

[self.tableView addInfiniteScrollingWithActionHandler:^{ 
     @strongify(self) 

     if (!self.viewModel.isUpdating){ 

      self.viewModel.isUpdating = YES; 
      [self.tableView.infiniteScrollingView startAnimating]; 
      [self.viewModel nextPage]; 
      [self.tableView reloadData]; 
      self.viewModel.isUpdating = NO; 
     } 

    }]; 

Im zweiten Fall habe ich versucht Hintergrund Arbeit zu tun, nach nicht wie erwartet:

if (!self.viewModel.isUpdating){ 


    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     //Add some method process in global queue - normal for data processing 

    self.viewModel.isUpdating = YES; 
    [self.tableView.infiniteScrollingView startAnimating]; 
     [self.viewModel nextPage]; 


     dispatch_async(dispatch_get_main_queue(), ^(){ 
      //Add method, task you want perform on mainQueue 
      //Control UIView, IBOutlet all here 
      [self.tableView reloadData]; 
      self.viewModel.isUpdating = NO; 

     }); 

     //Add some method process in global queue - normal for data processing 

    }); 




} 

}]; 

Wie soll ich ändern mein Code nicht Haupt Thread zu laden, und ohne "komische" Dinge?

Antwort

0

haben Sie so etwas versucht.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
..... 
dispatch_async(dispatch_get_main_queue(), ^{ 
       [self performSelectorOnMainThread:@selector(updateView) withObject:nil waitUntilDone:YES]; 
      }); 
     }); 
...... 
-(void)updateView{ 
[self.tableView reloadData]; 
self.viewModel.isUpdating = NO; 
} 

Benutzer PerformSelectorOnMainThread kann es Ihnen helfen.

Verwandte Themen