0

Twitter REST/ストリーミング APIを使用しています。REST API にアクセスする場合は、NSMutableURLRequest(アクセス トークンやクエリなどのパラメーターを含む) を作成します。次に、リクエストを と組み合わせて使用​​してNSURLSession、データをロードします。変更可能なリクエスト オブジェクトを作成するライブラリを使用しています (リクエスト オブジェクトを使用しない場合、Twitter API では関連するユーザー データにアクセスできません)。

現在、ストリーミング API を介して Twitter のタイムラインを読み込もうとしています。私が抱えている問題の 1 つは、カスタムの変更可能な要求オブジェクトをオブジェクトで使用する方法がわからないことNSStreamです。私にできることは、hostURL リンクを設定することだけです。しかし、Twitter API がユーザー データにアクセスできるようにするには、ユーザーの OAuth データ (変更可能な要求オブジェクトに含まれています) を渡す必要があるため、これでは十分ではありません。

要求オブジェクトをストリームに添付するにはどうすればよいですか? これが私のコードです:

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];
4

1 に答える 1

1

アップデート

Twitter API の変更により、ストリーミング API は使用できなくなります。誰かがまだストリーミング API を使用している場合に備えて、ここに私の回答を残しておきますが、API はそれほど長くは稼働しません。代わりに、必要なデータを数秒/分ごとに手動で更新する必要があります。データを更新する頻度はユーザーベースに依存し、ユーザーベースが大きいほど、更新間隔を長くする必要があります。

私の解決策

私は自分の問題を解決することができました。Web ソケット ライブラリまで多くのソリューションを試してみCFStreamましたが、Twitter ストリーミング API がソケットをサポートしていないことがわかりました。

NSURLSessionTwitter 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 を更新するだけです。

于 2017-08-04T09:42:17.783 に答える