我目前有一个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没有执行回调。
答案 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操作。