如何将self传递给对象类并在完成后调用它?

时间:2012-07-10 06:54:03

标签: objective-c uiviewcontroller delegates

我目前有一个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];

}

其中performCallback是UIViewController中的简单NSLog() - 语句:

-(void)performCallback{

    NSLog(@"Successfully performed a callback");    

{

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

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

我如何实现这一目标?

任何提示和/或指示都将受到高度赞赏!

提前致谢。

修改 实际问题是fooObject没有执行回调。

1 个答案:

答案 0 :(得分:0)

目前还不清楚你想要完成什么。你在做什么似乎与两种不同的设计模式有关:

  • 代表
  • 异步回叫

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

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

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

另一方面,如果您担心在HTTP post正在进行时阻塞主线程,那么您将需要使用异步回调之类的东西。最简单的方法是使用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操作。