1

私がやろうとしていること: URL リクエスト (投稿) があり、API サーバーにいくつかの情報を送信してから、バイト単位でデータのストリーミングを開始します。

1) ストリームを設定しようとしているときにデータを投稿するにはどうすればよいですNSURLRequestか?現在は URL を使用しているだけです。

2) ストリームが開かれず (streamStatus が 0 を返す)、- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode呼び出されないのはなぜですか? 、これは私の最善の試みであり、大部分はこのガイドに従っています

- (void)setUpStreamFromURL:(NSURL *)path {

     // iStream is NSInputStream instance variable
     iStream = [[NSInputStream alloc] initWithURL:path];
     [iStream setDelegate:self];
     [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
                   forMode:NSDefaultRunLoopMode];
     [iStream open];

     NSLog(@"Stream Open: %lu",[iStream streamStatus]); //return 0
}

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
     NSLog(@"Streaming");
     switch(eventCode) {
         case NSStreamEventHasBytesAvailable:
         {
             if(!_data) {
                  _data = [[NSMutableData data] init];
             }
              uint8_t buf[1024];
              unsigned int len = 0;
              len = [(NSInputStream *)stream read:buf maxLength:1024];
              if(len) {
              [_data appendBytes:(const void *)buf length:len];
              NSLog(@"DATA BEING SENT : %@", _data);
              // bytesRead is an instance variable of type NSNumber.
             // [bytesRead setIntValue:[bytesRead intValue]+len]; //getting error that setInt value is not part of NSNumber, and thats true so not sure what to do about it, but this isn't the issue. 
              } else {
                    NSLog(@"no buffer!");
              } 
              break;
         }
         case NSStreamEventEndEncountered:
         {
              [stream close];
              [stream removeFromRunLoop:[NSRunLoop currentRunLoop]
                          forMode:NSDefaultRunLoopMode];
              stream = nil; // stream is ivar, so reinit it
              break;
         }
        // continued ...
     }
}

また、それが役立つ場合、私のヘッダーファイル:

 #import <Foundation/Foundation.h>
 #import "Login.h"

 @interface Stream : NSStream <NSStreamDelegate> {
NSMutableArray *searchIdList;
NSInputStream *iStream;
NSNumber *bytesRead;

}
- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode ;
-(id)initWithLoginObject:(Login *)log;
@property NSMutableData *data;
@end
4

1 に答える 1

0

NSURLRequestストリームでは使用できません。

リクエストを作成するには、これを使用できます。

request = CFHTTPMessageCreateRequest(kCFAllocatorDefault, CFSTR("POST"),(CFURLRef) url, kCFHTTPVersion1_1);
CFHTTPMessageSetHeaderFieldValue(request, CFSTR("User-Agent"), CFSTR("MSControl-US"));
CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Content-Type"), CFSTR("application/json"));
CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Connection"), CFSTR("Keep-Alive"));

その後、次を使用してストリームを作成できます

 readStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, request)

または、すでに開いているストリームがある場合は、リクエストを次のようにシリアル化できます。

NSData *data = (NSData *)CFHTTPMessageCopySerializedMessage(request);

これで送信します:

length = [data length];
CFWriteStreamWrite((CFWriteStreamRef)outStream,data,lenght);

この助けを願っています

于 2013-04-10T10:03:50.393 に答える