0

我对GCD有点困惑

我尝试调用一个执行我的 web 服务调用的类:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [searchService doSearch:self.searchData];
});

我正在使用 Sudzc 生成的网络服务。对使用 Sudzc 生成且位于 SearchService 类中的服务的实际服务调用如下:

 [service doSearch:self action:@selector(doSearchHandler:) e: searchArgs];

通话结束后,我应该返回:

- (void) doSearchHandler: (id) value {
}

如果不使用 GCD,它可以正常工作,但是当我添加它时,我永远不会返回到 doSearchHandler 方法。

4

2 回答 2

1

我遇到了 Sudzc 操作阻塞主线程的问题。但是,Soap 请求不是问题,因为虽然 NSURLRequest 在主线程上执行,但它的数据由委托管理didReceiveData

阻止我的 UI 的是在 Handler 方法中对接收到的 XML 的处理。

在处理程序方法 ( - (void) SudzcRequestHandler: (id) value { ...) 中,我像这样处理数据:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

...processing...

[[NSNotificationCenter defaultCenter] postNotificationName:KManagerHasFinishedLoading object:self userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:NOTIFICATION_RESULT_OK], @"Result", nil]];

});

我在 Manager 中运行处理,它是一个单例对象,但其他实现可能会有所不同。所以通知用于让我的 ViewController 知道处理已经结束。

于 2012-07-20T15:40:49.970 回答
0

您应该研究 Sync-Async 模式。此SO的答案中的两个链接将有所帮助。它不直接使用 GCD。但是你可以很容易地适应。

于 2012-07-07T10:12:57.247 回答