1

我有一些我的框架是做一些需要时间的事情,当我试图调用它的方法时,它实际上冻结了屏幕中的移动 0.5 秒。

我试图在后台调用它:

[self performSelectorInBackground:@selector(transmitNow:) withObject:nil];

-(void)transmitNow:(id)sender
{
     [instance sendWithData:data]; //takes time 

}

但它仍然需要相同的时间。有没有办法在后台启动它,这样它就不会停止主进程?

谢谢 。

4

3 回答 3

2

是的。您可以使用 NSOperationQueue 和 NSOperation 来执行此操作。考虑以下代码:

NSOperationQueue* queue = [[NSOperationQueue alloc] init];
[queue addOperationWithBlock:
^{
     [instance sendWithData:data];
}];

这将创建一个本质上是后台线程的 NSOperationQueue。它将向该队列添加一个操作,该操作将完成,然后线程将自动关闭并清理。

阅读 NSOperations 和 NSOperationQueue 了解更多信息。

于 2013-09-27T13:26:59.723 回答
1

我会使用 GCD(Grand Central Dispatch):

dispatch_async(dispatch_get_global_queue(0, 0), ^{
    [instance sendWithData:data]; 
};
于 2013-09-27T13:26:04.600 回答
0

你似乎写的应该做你想做的,我会设置一个断点以确保发生这种情况,
同样通过在单线程应用程序上调用它,你将切换到多线程模式,这可能会占时间你看到了。再次调用可能非常快。

在后台做事也可能很危险,所以准备做一些锁定:

-(void)transmitNow:(id)sender
{
    @synchronized(data)
    {
         [instance sendWithData:data]; //takes time 
    }
}

还知道,如果您的主线程遇到数据争用,它可能仍会挂起……仅供参考。

于 2013-09-27T13:33:08.263 回答