首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CFReadStream For HttpRequest

CFReadStream For HttpRequest
EN

Stack Overflow用户
提问于 2015-04-20 10:23:43
回答 1查看 350关注 0票数 1

我必须开发一个终端工具应用程序,以创建一个迪蒙运行每20秒。

这个Deamon简单地做了这个步骤

  • 验证是否存在一个文件:在这个文件中读取一个通行证
  • 从USB连接设备读取所有serial_numbers
  • 创建HTTP请求并在querystring上发送此参数

最初的2 steph运行完美,但是在发送HTTPRequest之后,主线程退出应用程序,因为不要等待响应。

这是我的HTTPRequest代码:(我必须使用CoreFoundation框架,因为来自Foundation的NSConnection没有运行)

代码语言:javascript
复制
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“函数从不调用,因为主线程退出:

代码语言:javascript
复制
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;
}

我的错误在哪里?

为什么应用程序从不等待响应?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-21 12:41:36

你启动了恶魔,这很可能是背景。在它完成之前,你可以释放它。它已经消失了..。

文档中,我将暗示您需要设置一个客户端,然后等待来自流的响应。你的应用程序刚启动恶魔就退出了。

您可以在主目录中使用while循环,并检查流是否完成。那你就可以退出了。只要您给出运行环计算时间,例如,在while循环中使用[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]];

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29745260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档