2010-06-25 2 views
0
 
Application Specific Information: 
com.oneorangetree.iphoneexample failed to launch in time 
elapsed total CPU time (seconds): 3.500 (user 1.680, system 1.820), 17% CPU 
elapsed application CPU time (seconds): 0.920, 5% CPU 

Когда приложение загружается, оно делает много вещей в viewDidLoad Для завершения требуется около 30 секунд. Как я могу поместить это в фоновый поток или что-то ускорить приложение и предотвратить крах (потому что он слишком долго загружался)Как ускорить мое приложение для iPad?

ответ

1

Я использовал NSOperation/NSOperationQueue в прошлом для простой резьбы. В частности, NSInvocationOperation позволяет прокручивать вызов метода, который занимает некоторое время, и NSOperationQueue практически нити его для вас. Метод, который вы создаете, должен быть потокобезопасным, но это не особенно сложно сделать. Например, вы можете создать NSOperationQueue в своих методах -init или -viewDidLoad, а затем добавить NSInvocationOperation в очередь и отправить его на своем пути.

NSOperationQueue *opQueue = [[NSOperationQueue alloc] init]; 
NSInvocationOperation *lengthyTask = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(processAddresses) object:nil]; 
[opQueue addOperation:lengthyTask]; 
[lengthyTask release]; 

Одна из своего рода интересных вещей (особенно на рабочем столе), что на 10,6 (и IOS 4) Grand Central Dispatch автоматически используется.

При выполнении многозадачной задачи приложение должно быть более отзывчивым (особенно если вы смотрите результаты и показываете их, когда они входят из задачи с резьбой, возможно, с KVO), было бы полезно реализовать некоторое кэширование. Перезагрузка адресной книги при каждом запуске была бы очень дорогостоящей, особенно большинство людей не меняли адресную книгу. Вы можете хранить вычисленные данные в локальном файле или базе данных (Core Data не слишком сложно использовать, и если это слишком медленно, вы можете напрямую использовать SQLite). Затем при запуске вы можете запускать адресную книгу, сравнивая даты модификации каждой записи с момента последнего запуска приложения, геокодируя недавно измененные записи.

+0

спасибо. Это действительно ускорило загрузку приложения, но есть ли способ уведомить пользователя о том, что мы все еще загружаем данные, чтобы он/она не думал, что приложение застыло? –

+0

Я предполагаю, что каждая операция выполняется последовательно, поэтому вы можете обновлять интерфейс по мере возврата каждой записи. Двумя способами это может быть реализовано с обратным вызовом из задачи с потоком (вроде делегата), которая обновляет интерфейс с помощью аргумента. Другим способом было бы реализовать [KVC] (http://goo.gl/jIBP) в коллекции ваших данных. Попросите объект наблюдать за сбором и обрабатывать обновления по мере их поступления. Запрет на то, что вы можете попробовать показать загружаемое сообщение по экрану, вроде [этого] (http://goo.gl/ZM7g) –

1

Да, вы могли бы использовать фоновый поток, однако лучший подход был бы для предварительного -каскалить (или кешировать) вещи, где это возможно, чтобы время загрузки не было таким длинным. Что это за код, который так долго запускается?

+0

В основном я перехожу на Google Карты и адреса геокодирования в вашу контактную книгу. Это займет много времени, если у вас ТОНКИ контактов. У меня 300+, и приложение падает, потому что это занимает много времени. –

+0

Как сказал paxswill, используя NSOperationQueue, вы сможете получить эту работу без особых проблем. Если вы создаете подкласс NSOperation, который обрабатывает поиск одной записи в адресной книге, тогда создайте экземпляры для каждого из контактов, которые NSOperationQueue позаботится обо всех потоках для вас. В качестве дополнительного бонуса, если (когда) iDevice выйдет на сцену с более чем одним ядром NSOperationQueue, он сможет воспользоваться этим, не сделав ни одного изменения вашего кода :) – Daniel

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