推特流媒体API-Objective-C

推特流媒体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

我正在使用推特REST/流媒体API。当我想要访问RESTAPI时,我会创建一个
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