NSThread with delegate for SimplePing



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

SimplePing *localPing = [SimplePing simplePingWithHostName:pingHost];
        [localPing setDelegate:self];
        [localPing start];
        do {
            [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
        } while (localPing != nil);

使用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"];

最新更新