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 словарь и обновите свой интерфейс соответственно.

Другие вопросы по тегам