尝试编写基本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
答案 0 :(得分:0)
您应该在调用locations
之前实例化-initNetworkConnection
(以便打开您的流)。否则,当您收到第一个locations
通知时,nil
可能会NSStreamEventHasBytesAvailable
。