[英]Twitter Streaming API - Objective-C
我正在使用Twitter REST / Streaming API 。 當我想訪問REST API時,我創建了一個NSMutableURLRequest
(包含訪問令牌和查詢之類的參數)。 然后,我將請求與NSURLSession
結合使用以加載數據。 我正在使用為我創建可變請求對象的庫(如果我不使用請求對象,那么Twitter API將不允許我訪問相關的用戶數據)。
現在,我正在嘗試通過流API加載Twitter時間軸。 我遇到的一個問題是我無法弄清楚如何將自定義可變請求對象與NSStream
對象一起使用。 我唯一能做的就是設置host
URL鏈接。 但這還不夠好,因為我需要傳遞用戶OAuth數據(包含在可變請求對象中),以便Twitter API允許我訪問用戶數據。
如何將請求對象附加到流? 這是我的代碼:
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];
UPDATE
由於Twitter API的更改,流式API將不再可用。 我將在這里保留我的答案,以防萬一有人仍在使用流API,但是該API的使用時間不會更長。 相反,您必須每隔幾秒/分鍾手動刷新一次所需的數據-刷新數據的頻率取決於您的用戶群,用戶群越大,刷新間隔應該越長。
我的解決方案
我設法解決了我的問題。 我嘗試了從CFStream
到Web套接字庫的許多解決方案....才發現Twitter Streaming API不支持套接字.....一個好的開始!
我最終使用NSURLSession
及其關聯的委托方法,從Twitter API設置和加載連續的數據流。 完美工作,並且非常容易設置:
在標題中設置委托: <NSURLSessionDelegate>
以下代碼中的request
是我創建的NSURLRequest
對象,該對象存儲Twitter流URL,查詢參數和用戶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
字典中返回的數據並相應地更新UI。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.