API потокового вещания Twitter - Objective-C
Я работаю с API REST/Streaming в Twitter. Когда я хочу получить доступ к REST API, я создаю NSMutableURLRequest
(содержит такие параметры, как токены доступа и запросы). Затем я использую запрос в сочетании с NSURLSession
загрузить данные. Я использую библиотеку, которая создает изменяемый объект запроса для меня (если я не использую объект запроса, то API Twitter не позволит мне получить доступ к соответствующим данным пользователя).
Сейчас я пытаюсь загрузить временную шкалу Twitter через потоковый API. Одна проблема, с которой я сталкиваюсь, заключается в том, что я не могу понять, как использовать мой изменяемый объект запроса с NSStream
объект. Единственное, что я могу сделать, это установить host
URL-ссылка. Но этого недостаточно, потому что мне нужно передать пользовательские данные OAuth (которые включены в изменяемый объект запроса), чтобы API Twitter позволил мне получить доступ к пользовательским данным.
Как я могу прикрепить объект запроса к потоку? Вот мой код:
NSURL *website = [NSURL URLWithString:@"https://userstream.twitter.com/1.1/user.json"];
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)[website host], 80, &readStream, &writeStream);
NSInputStream *inputStream = (__bridge_transfer NSInputStream *)readStream;
NSOutputStream *outputStream = (__bridge_transfer NSOutputStream *)writeStream;
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];
1 ответ
ОБНОВИТЬ
Из-за изменений в Twitter API, потоковый API больше не будет доступен. Я оставлю здесь свой ответ на всякий случай, если кто-нибудь еще работает с потоковым API, но API не будет работать намного дольше. Вместо этого вам придется вручную обновлять нужные вам данные каждые несколько секунд / минут - как часто вы обновляете данные до вашей пользовательской базы, чем больше пользовательская база, тем больше должны быть интервалы обновления.
Мое решение
Мне удалось решить мою проблему. Я перепробовал много решений от CFStream
к библиотекам веб-сокетов.... только для того, чтобы узнать, что API потокового вещания Twitter не поддерживает сокеты..... отличный старт!
Я в конечном итоге с помощью NSURLSession
и связанные с ним методы делегатов для настройки и загрузки непрерывного потока данных из API Twitter. Работает отлично и невероятно прост в настройке:
Установите делегата в своем заголовке: <NSURLSessionDelegate>
request
в приведенном ниже коде является NSURLRequest
созданный мной объект, который хранит URL-адрес потока Twitter, параметры запроса и пользователя OAuth
данные заголовка аутентификации.
Создайте объект запроса / сеанса URL:
// Set the stream session.
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
// Start the data stream.
[[session dataTaskWithRequest:request] resume];
Наконец, настройте методы делегата:
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
NSError *feedError = nil;
NSDictionary *feed = [NSJSONSerialization JSONObjectWithData:data options:0 error:&feedError];
NSLog(@"%@", feed);
}
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
if (error) {
NSLog(@"%@", error);
}
}
Это оно! Теперь все, что вам нужно сделать, это проанализировать данные, возвращенные в feed
словарь и обновите свой интерфейс соответственно.