Wenn ich UI-Updates vom Hauptthread mache, scheinen sie nicht sofort wirksam zu werden. Das heißt, die Änderungen erscheinen nicht sofort auf dem Bildschirm.iOS UIView wird nicht sofort aktualisiert
Hier ist eine vereinfachte Version des Codes Ich bin mit:
- (void) do_ui_update {
// UI update here that does not appear immediately
}
- (void) some_time_consuming_function {
// line 1
// line 2
// ...
// line n
}
- (void) function_that_runs_in_main_thread {
[self RUN_ON_UI_THREAD:^{
[self do_ui_update];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self some_time_consuming_function];
});
}];
}
- (void) RUN_ON_UI_THREAD:(dispatch_block_t)block
{
if ([NSThread isMainThread])
block();
else
dispatch_sync(dispatch_get_main_queue(), block);
}
Wenn die Debug-Haltepunkte an jeder Zeile in some_time_consuming_function
, manchmal sind die UI-Updates auf dem Bildschirm angezeigt Einstellung, wenn der Debugger Linie 2 trifft, irgendwann Zeile 3 und so weiter.
Also meine Frage ist: Wie kann ich die UI-Updates auf dem Bildschirm erscheinen, bevor die erste Zeile von some_time_consuming_function
erreicht wird?
Das klingt für mich wie 'function_that_runs_in_main_thread' nicht immer auf der Haupt-Thread ist. Wenn Sie einen Breakpoint auf '[self do_ui_update]' setzen, ist es dann zu 100% im Hauptthread? – Swinny89
können Sie Code anzeigen, der das function_that_runs_in_main_thread im Hauptthread ausführt? –
Ich vermute, dass dies mit der Run-Schleife zusammenhängt. Die Ansicht wird erst am Ende der Runloop aktualisiert. Am besten ist es, wenn 'some_time_consuming_function' in einem Hintergrund-Thread läuft, um das Problem zu lösen. – Droppy