我必须开发一个终端工具应用程序,以创建一个迪蒙运行每20秒。
这个Deamon简单地做了这个步骤
最初的2 steph运行完美,但是在发送HTTPRequest之后,主线程退出应用程序,因为不要等待响应。
这是我的HTTPRequest代码:(我必须使用CoreFoundation框架,因为来自Foundation的NSConnection没有运行)
for (int i = 0; i < [_arrayOfSerial count]; i++) {
CFStringRef urlFirst = CFSTR("http://192.168.30.9:88/virtualBadge.aspx?token=");
CFStringRef token =(CFStringRef)_codicePWD;
CFStringRef urlSecond = CFSTR("&serial=");
CFStringRef serial = (CFStringRef) [_arrayOfSerial objectAtIndex:i];
NSLog(@"URL: %@%@%@%@", urlFirst,token,urlSecond,serial);
CFStringRef strs[4];
strs[0] = urlFirst;
strs[1] = token;
strs[2] = urlSecond;
strs[3] = serial;
CFArrayRef urlArray = CFArrayCreate(kCFAllocatorDefault, (void*)strs, 4, &kCFTypeArrayCallBacks);
CFStringRef urlCompleta = CFStringCreateByCombiningStrings(kCFAllocatorDefault, urlArray, CFSTR(""));
NSLog(@"Url: %@",urlCompleta);
CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, urlCompleta, NULL);
CFStringRef headerFieldName = CFSTR("host");
CFStringRef headerFieldValue = CFSTR("192.168.30.9");
CFStringRef requestMethod = CFSTR("GET");
CFHTTPMessageRef myRequest =CFHTTPMessageCreateRequest(kCFAllocatorDefault, requestMethod, myURL, kCFHTTPVersion1_1);
CFHTTPMessageSetHeaderFieldValue(myRequest, headerFieldName, headerFieldValue);
CFDataRef mySerializedRequest = CFHTTPMessageCopySerializedMessage(myRequest);
if(CFHTTPMessageIsRequest(myRequest)){
NSLog(@"Is a Request: OK");
if(CFHTTPMessageIsHeaderComplete(myRequest)){
NSLog(@"Header OK");
}
}
CFReadStreamRef myReadStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, myRequest);
CFOptionFlags events = kCFStreamEventHasBytesAvailable | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered | kCFStreamEventCanAcceptBytes | kCFStreamEventNone | kCFStreamEventOpenCompleted;
CFStreamClientContext dataStreamContext = {
0,
self,
(void *(*)(void *info))CFRetain,
(void (*)(void *info))CFRelease,
(CFStringRef (*)(void *info))CFCopyDescription
};
if(CFReadStreamSetClient(myReadStream, events, EvenCallBack, &dataStreamContext)){
CFReadStreamScheduleWithRunLoop(myReadStream, CFRunLoopGetMain(), kCFRunLoopCommonModes);
}
if(CFReadStreamOpen(myReadStream)){
NSLog(@"Stream Open - ");
}
NSString *messReq = [[[NSString alloc] initWithData:(NSData*)mySerializedRequest encoding:NSASCIIStringEncoding] autorelease];
CFRelease(myRequest);
CFRelease(myURL);
CFRelease(urlArray);
CFRelease(urlCompleta);
CFRelease(myReadStream);
NSLog(@"Serialized Request: %@", messReq);
// NSLog(@"Request Send");
}"EvenCallBack“函数从不调用,因为主线程退出:
int main(int argc, const char * argv[])
{
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
Demone* demone = [[Demone alloc] init]; //This is the class that start all process
[demone startDemone]; //Function start process
[demone release];
}
NSLog(@"Exit");
return 0;
}我的错误在哪里?
为什么应用程序从不等待响应?
发布于 2015-04-21 12:41:36
你启动了恶魔,这很可能是背景。在它完成之前,你可以释放它。它已经消失了..。
从文档中,我将暗示您需要设置一个客户端,然后等待来自流的响应。你的应用程序刚启动恶魔就退出了。
您可以在主目录中使用while循环,并检查流是否完成。那你就可以退出了。只要您给出运行环计算时间,例如,在while循环中使用[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]];。
https://stackoverflow.com/questions/29745260
复制相似问题