2012-06-07 4 views
1

У меня возникли проблемы с моим кодом и я не уверен, как ускорить процесс. Вот мой код из приложения делегата (didFinishLaunchingWithOptions метод тела):Улучшение скорости выполнения кода

initialized = [[NSUserDefaults standardUserDefaults] boolForKey:@"initialized"]; 

if (!initialized) { 
    dispatch_queue_t queue = dispatch_get_global_queue(
                 DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 


    dispatch_async(queue, ^{ 
     [DAO setDocumentsCacheDirectory:[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]]; 

     ....download images and files needed by application 

     NSLog(@"%@", @"Finished downloadding images and files"); 

     [[NSNotificationCenter defaultCenter] postNotificationName:@"refreshView" object:nil]; 
     [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"initialized"]; 
    }); 
} 

Хотя это асинхронная загрузка происходит я спиннинг рисунок на мой взгляд. Как вы можете видеть, когда вся эта загрузка выполнена, метод refreshView запускается в моем контроллере просмотра.

После того, как загрузка завершена, у меня есть NSLog (@ "% @", @ "Законченная перезагрузка .."); поэтому я знаю, когда представление перезагрузилось.

Проблема:

Так что я смотрю на консоли:

2012-06-07 12:52:34.898 TestApp[29800:13c03] Finished downloadding images and files 
[Switching to process 29800 thread 0x13c03] 
2012-06-07 12:52:34.909 TestApp[29800:13c03] Finished reloading.. 

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

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

Что вы будете делать дальше?

ответ

5

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

dispatch_async(queue, ^{ 
    [DAO setDocumentsCacheDirectory:[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]]; 

    ....download images and files needed by application 

    NSLog(@"%@", @"Finished downloadding images and files"); 

    dispatch_sync(dispatch_get_main_queue(), ^{ 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"refreshView" object:nil]; 
    } 

    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"initialized"]; 
}); 

Примечание Я использовал dispatch_sync здесь .. . NSUserDefaults не будет обновляться до завершения основного блока очереди.

+0

w0w отличный ответ Я предполагаю, что я все еще изучаю основы. Отсутствуют некоторые базовые знания. спасибо – London

+0

'[[NSUserDefaults standardUserDefaults] setBool: YES forKey: @" initialized "];' эта часть находится в правильной позиции? Также, похоже, немного смуты. – Peres

Смежные вопросы