[英]Trouble using NSInputStream
嘗試編寫基本iPhone應用程序的總新手。 我為服務器編寫了代碼,可以將行從我的應用程序發送到服務器,但是在從服務器接收行時遇到了麻煩。
另外,這個程序似乎僅在我使用調試器運行它時才起作用。
任何幫助表示贊賞。 謝謝。
這是我的代碼:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
manager = [[CLLocationManager alloc] init];
manager.distanceFilter = kCLDistanceFilterNone;
manager.desiredAccuracy = kCLLocationAccuracyBest;
[manager startUpdatingLocation];
CLLocation *curLocation = [manager location];
NSString *theLocation = curLocation.description;
NSLog(@"%@", theLocation);
//open the connection
[self initNetworkConnection];
NSData *data = [[NSData alloc] initWithData:[theLocation dataUsingEncoding:NSASCIIStringEncoding]];
NSLog(@"%@", data);
[outputStream write:[data bytes] maxLength:[data length]];
//recieve data from the server
locations = [[NSMutableArray alloc] init];
NSLog(@"%@", locations);
[inputStream close];
[outputStream close];
}
-(void)initNetworkConnection {
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"137.165.8.168", 13413, &readStream, &writeStream);
NSLog(@"connection created!");
inputStream = (__bridge NSInputStream *)readStream;
outputStream = (__bridge NSOutputStream *)writeStream;
//set delegates
[inputStream setDelegate:self];
[outputStream setDelegate:self];
//have processes perform in a run loop
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
//now open the streams
[inputStream open];
[outputStream open];
}
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {
NSLog(@"got an event");
switch (eventCode) {
case NSStreamEventHasSpaceAvailable:
NSLog(@"None!");
break;
case NSStreamEventOpenCompleted:
NSLog(@"Stream opened");
break;
case NSStreamEventHasBytesAvailable:
if (aStream == inputStream) {
uint8_t buffer[1024];
int len;
while ([inputStream hasBytesAvailable]) {
len = [inputStream read:buffer maxLength:sizeof(buffer)];
if (len > 0) {
NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];
if (nil != output) {
NSLog(@"%@",output);
[locations addObject:output];
}
}
}
}
}
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
您應在調用-initNetworkConnection
之前實例化locations
(並因此打開流)。 否則,當您收到第一個NSStreamEventHasBytesAvailable
通知時, locations
可能nil
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.