IOS анализирует данные JSON в другом потоке? - PullRequest
3 голосов
/ 01 марта 2012

В настоящее время я работаю над приложением, которое анализирует некоторые данные JSON в классе APPdelegate при изменении местоположения.

Мой вопрос: «Как наиболее подходящий способ сделать это?»В настоящее время при анализе данных приложение «замораживается», пока данные не будут загружены.

Мне нужен совет :)

Спасибо

Ответы [ 3 ]

10 голосов
/ 01 марта 2012

Конечно, есть несколько способов, включая NSThread, NSOperation и старомодный libpthread.Но наиболее удобным (особенно для простых фоновых задач) я считаю libdispatch, также называемый Grand Central Dispatch .

Используя очереди отправки, вы можете быстро делегировать трудоемкую задачуотдельный поток (или, точнее, очередь выполнения - GCD решает, является ли это потоком или асинхронной задачей).Вот самый простой пример:

// create a dispatch queue, first argument is a C string (note no "@"), second is always NULL
dispatch_queue_t jsonParsingQueue = dispatch_queue_create("jsonParsingQueue", NULL);

// execute a task on that queue asynchronously
dispatch_async(jsonParsingQueue, ^{
    [self doSomeJSONReadingAndParsing];

    // once this is done, if you need to you can call
    // some code on a main thread (delegates, notifications, UI updates...)
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.viewController updateWithNewData];
    });
});

// release the dispatch queue
dispatch_release(jsonParsingQueue);

Приведенный выше код будет читать данные JSON в отдельной очереди выполнения, не блокируя поток пользовательского интерфейса.Это всего лишь простой пример, и GCD предлагает гораздо больше, поэтому для получения дополнительной информации ознакомьтесь с документацией.

2 голосов
/ 01 марта 2012

Используйте NSOperation, чтобы справиться с этим.

Вы можете следовать этому руководству: http://www.cimgf.com/2008/02/16/cocoa-tutorial-nsoperation-and-nsoperationqueue/

И яблочный документ: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html

0 голосов
/ 01 марта 2012

Вы можете использовать NSURConnections и извлекать данные асинхронно (или стороннюю библиотеку, такую ​​как ASIHTTPRequest), чтобы получить ваши данные.Если вы сделаете все в своем основном потоке, ваш пользовательский интерфейс будет зависать до тех пор, пока он не обработает загрузку и т.д.Итак, взгляните на Многопоточность iOS .И последнее замечание: Locations Пример кода от Apple дает именно то, что вы хотите:)

...