首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >卡在循环表单CFRunLoop中

卡在循环表单CFRunLoop中
EN

Stack Overflow用户
提问于 2012-04-23 05:10:48
回答 1查看 994关注 0票数 0

ViewController.h

代码语言:javascript
复制
@interface ViewController : UIViewController{
CFSocketRef s;
int connectFlag;
}

ViewController.m

代码语言:javascript
复制
void receiveDataCilent(CFSocketRef cs, 
                   CFSocketCallBackType type, 
                   CFDataRef address, 
                   const void *data, 
                   void *info)
{  

CFDataRef df = (CFDataRef) data;
int len = CFDataGetLength(df);
if(len <= 0) return;

CFRange range = CFRangeMake(0,len);
UInt8 buffer[len];
NSLog(@"Received %d bytes from socket %d\n", 
      len, CFSocketGetNative(cs));
CFDataGetBytes(df, range, buffer);
NSLog(@"Client received: %s\n", buffer); 
NSLog(@"As UInt8 coding: %@", df);
NSLog(@"len value: %d", len);


}

-(void) clientConnect:(int)sender;{



s = CFSocketCreate(NULL, PF_INET, 
                    SOCK_STREAM, IPPROTO_TCP, 
                    kCFSocketDataCallBack, 
                    receiveDataCilent, 
                    NULL);

struct sockaddr_in      sin; 
struct hostent          *host;

memset(&sin, 0, sizeof(sin));

host = gethostbyname("localhost");      

memcpy(&(sin.sin_addr), host->h_addr,host->h_length); 

sin.sin_family = AF_INET;
sin.sin_port = htons(6666);

CFDataRef address;
CFRunLoopSourceRef source;

address = CFDataCreate(NULL, (UInt8 *)&sin, sizeof(sin));
CFSocketConnectToAddress(s, address, 0);

CFRelease(address);

source = CFSocketCreateRunLoopSource(NULL, s, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), 
                   source, 
                   kCFRunLoopDefaultMode);
CFRelease(source); 
CFRunLoopRun(); 

}

- (void)viewDidLoad
{
[super viewDidLoad];
}

- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];

if(connectFlag == 0 ){
[self clientConnect:1];
}

}

首先,我很抱歉搞乱了xcode编程和线程编程的概念,我对xcode非常陌生,我需要尽快完成我的游戏项目

此代码用于连接到服务器并等待来自服务器的消息。我试着测试它,它工作得很好。在视图中,我有可以按下并更改视图的IBAction。

但在我将其实现到我的主项目之后。它可以运行,但我不能按任何按钮或做任何事情。在注销之后。它似乎被CFRunLoopRun()卡住了;我想它卡在循环中了,但是为什么当我测试它的时候。它没有卡住吗?

在我的项目中,这段代码是从另一个视图运行的,而不是像我刚刚测试的那样从ViewController运行。我不知道为什么它会停留在我的项目中。

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-23 05:32:35

不要自己在主线程上运行run循环。主事件循环将运行它。

编辑:我应该说,“在GUI应用程序的上下文中”。在命令行工具中,您确实需要自己运行run循环。

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

https://stackoverflow.com/questions/10272164

复制
相关文章

相似问题

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