NSThread与SimplePing的委托

时间:2012-08-07 18:36:26

标签: cocoa nsrunloop

我目前正在Mac OS X应用程序中使用Apple的SimplePing在传输数据之前对URL进行ping操作,这样可以正常工作,但会锁定我的UI。我可能没有找到合适的地方,但我如何防止这种情况发生?我目前正在使用currentRunLoop,我认为这是问题,但我仍然希望用户能够在此操作期间与UI进行交互(例如取消)。如何为Simple Ping创建运行循环,以便我的UI不会锁定?

SimplePing *localPing = [SimplePing simplePingWithHostName:pingHost];
        [localPing setDelegate:self];
        [localPing start];

        do {
            [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
        } while (localPing != nil);

1 个答案:

答案 0 :(得分:0)

这是因为在使用SimplePing时您的UI被锁定是因为ping实用程序需要一定的时间才能完成。而且似乎您在主线程中执行此操作,从而导致锁定UI界面白色ping任务正在进行中。 所以你可以使用以下代码

-(void) ping:(NSString *) ip
{
SimplePing *localPing = [SimplePing simplePingWithHostName:pingHost];
[localPing setDelegate:self];
[localPing start];
}

然后在新线程中调用ping函数,如

[NSThread detachNewThreadSelector:@selector(ping:) toTarget:self. withObject:@"IP Address"];