【问题标题】:Performning sudzc webservice using GCD使用 GCD 执行 sudzc webservice
【发布时间】:2012-07-06 09:28:04
【问题描述】:

我对 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 方法。

【问题讨论】:

  • 如果使用 dispatch_get_main_queue() 会怎样?
  • 那行,我正确获取数据但图形界面冻结,直到操作完成,这是我的核心问题。

标签: iphone objective-c ios sudzc


【解决方案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 知道处理已经结束。

【讨论】:

  • 太棒了!非常感谢!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    相关资源
    最近更新 更多