Показуємо таймлайн Twitter

twitter

Завдання отримання стрічки записів із Твіттера ділиться на завантаження даних із сервера, їх обробку та відображення. Як джерело записів використовувався формат JSON. Я продемонструю роботу з JSON на прикладі однієї з існуючих бібліотек, а також способи отримання даних із віддалених серверів за допомогою синхронних та асинхронних запитів.

Існує кілька вільних бібліотек для роботи з JSON на пристроях під керуванням iOS. З найвідоміших варто відзначитиJSON Framework (саме ця бібліотека була використана мною в процесі написання статті) таTouchJSON. Ці бібліотеки готові до використання в проектах для iOS. Можна також скористатися іншими бібліотеками (наприклад, легковагою cJSON ), написавши для них «обгортки» на Objective-C (такі обгортки англійською називаються wrapper).

де USERNAME – це ім'я користувача, зареєстрованого у Твіттері. Якщо такого користувача не існує, прийде відповідь у вигляді JSON, що містить опис помилки.

Синхронне завантаження даних

При використанні синхронних запитів ми надсилаємо запит на сервер і чекаємо, поки від нього прийде відповідь. При цьому виконання потоку, з якого було здійснено відправлення запиту, припиняється до відповіді. Після того, як сервер відповів, і ми отримали необхідні для роботи дані, виконання потоку продовжується.

Примітка: для більшої наочності я постарався уникнути autorelease-об'єктів там, де це можливо.

Синхронний запит для отримання стрічки користувача Твіттера надсилається так:

В результаті виконання цього методу об'єкт responseData запишеться відповідь від сервера. Об'єкти response (екземпляр NSURLResponse) таerror (екземпляр NSError) будуть містити відповідно дані відповіді (наприклад, кодування даних, що повертаються або тип MIME) і помилку, якщо така виникла в процесі виконання запиту.

Після отримання необхідних даних у вигляді об'єкта NSData можна відправити їх на розбір до парсера JSON. Як було сказано на початку статті, я скористався бібліотекою JSON Framework. Дані, отримані від сервера, були перетворені в NSString, тому що парсер при розборі рядка може повертати опис помилки, якщо вона виникне.

Асинхронне завантаження даних

Такий спосіб завантаження є кращим, оскільки процес отримання даних від віддаленого сервера відбувається в окремому потоці і дає більше можливостей для контролю за цим процесом. Створення з'єднання для асинхронного запиту відбувається так:

ПараметрstartImmediately:YES повідомляє, що завантаження можна розпочинати негайно. Якщо передати в нього значенняNO, то надсилання запиту доведеться робити вручну:

Об'єкт-делегат, переданий у параметрі delegate, містить такі методи, які викликатимуться під час роботи з'єднання.

Цей метод викликається у разі, якщо з'єднання перервалося внаслідок помилки. З нього можна викликати той об'єкт, який очікує на отримання даних, і, наприклад, показати повідомлення про помилку на екрані.

Цей метод викликається після встановлення з'єднання. З об'єкта response можна отримати різні дані про відповідь сервера. Наприклад, значення властивостіexpectedContentLength можна використовувати для відображення прогресу завантаження.

Асинхронні запити одержують дані порціями, і при отриманні чергової порції буде викликатись цей метод. Тому перед запуском запитунеобхідно створити екземпляр об'єктаNSMutableData, до якого і дописуватимуться отримані порції даних.

Цей метод викликається після завантаження даних. Тут можна обробити отримані дані, звільнити непотрібні об'єкти і передати управління об'єкту, який очікує ці дані (у разі це таблиця, куди виводяться твіти).

У демонстраційному проекті до цієї статті на екран виводяться твіти зі стрічки Артура Малосієва:

даних

У проекті використовується макрос TRACE для перевизначення NSLog. Зроблено це з метою відключення виведення налагоджувальної інформації при збиранні мети Release. Макрос виглядає так:

Для того, щоб цей макрос запрацював, і висновок NSLog відключався при збиранні мети Release, необхідно в налаштуваннях проекту зробити таке. — переходимо на вкладку Build — у списку Configuration вибираємо Debug — у рядку пошуку вводимо текст cflags — у пункті Other C Flags вводимо наступний параметр: -DDEBUG

таймлайн

Цей параметр повідомить компілятору, що при збиранні мети Debug буде визначено змінну DEBUG, і всі входження TRACE будуть замінені на NSLog. При складанні мети Release всі входження TRACE будуть відкинуті, і виведення налагоджувальної інформації не проводитиметься.

Вихідні коди бібліотеки JSON Framework розповсюджуються на умовах ліцензії BSD та доступні на github.

(Немає голосів)