推特流媒体API-Objective-C
我正在使用推特REST/流媒体API。当我想要访问RESTAPI时,我会创建一个推特流媒体API-Objective-C,objective-c,twitter,streaming,nsstream,cfreadstream,Objective C,Twitter,Streaming,Nsstream,Cfreadstream,我正在使用推特REST/流媒体API。当我想要访问RESTAPI时,我会创建一个NSMutableURLRequest(它包含访问令牌和查询等参数)。然后,我将该请求与NSURLSession结合使用以加载数据。我正在使用一个为我创建可变请求对象的库(如果我不使用请求对象,那么Twitter API将不允许我访问相关的用户数据) 现在我正试图通过流式API加载Twitter时间线。我遇到的一个问题是,我不知道如何使用带有NSStream对象的自定义可变请求对象。我唯一能做的就是设置hostURL
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];
更新
由于Twitter API的变化,流式API将不再可用。我将在这里保留我的答案,以防有人仍在使用流式API,但API将不会运行太久。相反,您必须每隔几秒/分钟手动刷新所需的数据—刷新数据的频率取决于用户群,用户群越大,刷新间隔就越长
我的解决方案
我设法解决了我的问题。我尝试了许多解决方案,从CFStream
到web套接字库。。。。结果发现Twitter流媒体API不支持套接字。。。。。好的开始
最后,我使用了NSURLSession
及其相关的委托方法,从twitterapi设置并加载连续的数据流。工作完美,安装极其简单:
在标题中设置代理:
下面代码中的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