1

我目前有一个 UIViewController 和一个 NSObject 类。

我想要做的是告诉 NSObject 类执行一个动作,然后告诉 UIViewController 当它完成它的动作。

我正在调用对象来执行它的操作,如下所示:

[fooObject performActionWithDelegate:self];

performActionWithDelegate 函数基本上只需要 UIViewcontroller 的委托来执行回调。

-(void)performActionWithDelegate:(id)d{

    // bar is declared in the fooObject header file
    // id bar;

    [bar setDelegate:d];

    [bar performCallback];

}

UIViewController 中performCallback的简单语句在哪里:NSLog()

-(void)performCallback{

    NSLog(@"Successfully performed a callback");    

{

现在,我希望这个工作。我的第一个猜测是,这不是解决这个问题的最佳方法。

问题的全部范围是 fooObject 应该对 web 服务执行 httppost 以更新其属性之一,然后通知 uiviewcontroller 操作是否成功。

我如何实现这一目标?

任何提示和/或指针将不胜感激!

提前致谢。

编辑: 实际问题是 fooObject 没有执行回调。

4

1 回答 1

0

目前尚不清楚您要完成的工作。您所做的似乎与两种不同的设计模式有关:

  • 代表
  • 异步回调

委托:如果出于某种原因将 UIViewController 的某些功能分离到另一个对象中,您将使用委托。而不是 UIViewController 做某事,它要求另一个对象来做。这通常用于代码重用,因此您可以在不同的情况下使用相同的 UIViewController 服务,只需更改委托以更改其某些行为。

异步回调:这允许在您做其他事情时在后台发生操作,然后在操作完成时通过调用对象的方法来通知。您可以在不涉及其他对象的情况下执行此操作。

在您的情况下,您为什么要向我们的 UIViewController 之外的 Web 服务执行 HTTP 发布?您是否只想将网络代码与 UI 代码分开?在这种情况下,您实际上并不需要委托,只需从 UIViewController 调用另一个对象的方法,当它返回时,它就完成了。它可以在其他参数中传回您需要的任何结果。通过在调用对象上设置属性来返回值通常不是一个很好的设计。即使您这样做, UIViewController 也不是真正的“代表”。

另一方面,如果您担心在 HTTP 发布过程中阻塞主线程,那么您将需要使用异步回调之类的东西。最简单的方法是使用Grand Central Dispatch。从概念上讲,您可以执行以下操作:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  [self doLongHTTPPost];
  dispatch_async(dispatch_get_main_queue(), ^{ [self longHTTPPostDone]; });
});

这将doLongHTTPPost在后台调用,然后在完成后的某个时间点调用longHTTPPostDone主线程,在该线程中可以安全地执行 UI 操作。

于 2012-07-10T07:41:35.440 回答