为 NSOperation 创建委托:回调问题

发布于 2024-11-07 11:28:42 字数 219 浏览 2 评论 0原文

我在简单的 TableView 中面临一个问题:我想在单独的线程中刷新来自网络的数据,以避免阻塞 UI。我创建了一个 NSOperation 来完成这项工作。该对象创建另一个对象来处理下载。下载器的委托是 NSoperation 对象。

我的问题是我的 NSoperation 对象没有从下载器收到任何回调。

如果我没有单独的线程,使用相同的代码(并调用 main 方法),它就可以完美工作。

I'm facing a problem in a simple TableView : i want to refresh the data from the Net in a separate thread to avoid blocking the UI. I've created a NSoperation that will do the job. This object creates an other object to handle the download. The delegate of the downloader is the NSoperation Object.

My problem is that my NSoperation Object does not get any call back from the Downloader.

If I don't you a separate thread, using the same code (and calling main method), it works perfectly.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

李白 2024-11-14 11:28:42

正如 Mirage 所说,NSURLConnection 被设计为使用运行循环。您可以在主线程上获得正在运行的 runloop 设置,但在其他线程中,您创建的 runloop 必须手动管理(基本上您必须运行它)。

我的建议是使用并发 NSOperation 并在 start 方法中检查您是否在主线程上:如果不是,请再次调用主线程上的 start 方法并退出

-(void)start 
{
     if ([NSThread mainThread] != [NSThread currentThread]) {
           [self performSelectorOnMainThread:@selector(start)];
           return;
     }
     rest of the real code is here ....
}

其他选项(更干净但肯定更难)是创建一个管理内部运行循环(或由调用者提供的运行循环)的 NSOperation,以便需要它的异步 API(如 NSURLConnection)可以在与 main 不同的线程上运行。

在官方 api 中搜索“LinkedImageFetcher”示例:类 QRunLoopOperation 正是这样做的。

As Mirage said, the NSURLConnection is designed to use a runloop. You get a running runloop setup for you on the main thread, but in other threads you create the runloop has to be managed manually (basically you have to run it).

My advice would be to use a concurrent NSOperation and in the start method check if you are on the main thread: if not, call again the start method on the main thread and bail out

-(void)start 
{
     if ([NSThread mainThread] != [NSThread currentThread]) {
           [self performSelectorOnMainThread:@selector(start)];
           return;
     }
     rest of the real code is here ....
}

The other options (cleaner but definitely harder) is to create an NSOperation that manages an internal runloop (or one supplied by the caller), so that async APIs that need it (like NSURLConnection) can be run on threads different than main.

Search for "LinkedImageFetcher" sample in the official api: the class QRunLoopOperation does exactly that.

攒一口袋星星 2024-11-14 11:28:42

示例代码会很好。您是否有机会在该单独的线程中使用 NSURLRequest ?如果是这样,请尝试在主线程上生成 NSURLRequest (无论如何,NSURLRequest 本身可以是异步的,所以这完全没问题)。

编辑 我的意思是 NSURLConnection,而不是请求。

Example code would be nice. Is there any chance you use NSURLRequest in that separate thread? If so, try spawning the NSURLRequest on the main thread (NSURLRequest can be async by itself anyway, so that is perfectly fine).

EDIT I meant NSURLConnection, not request.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文