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