我的问题如下,
我有4节课如下,
A) UIviewController(UI) B) Static Method web 服务请求类 c) Static Method web 服务响应解析类 D) Static Method web 服务响应处理类
数据流是 A->B->C->D 类,从 D 类到 A 类,
*需要的是 B,C,D 在后台进程中
请让我知道如何编写源代码来解决这个问题?
请随意填写以提供任何其他替代方法解决此问题。
提前致谢。
我的问题如下,
我有4节课如下,
A) UIviewController(UI) B) Static Method web 服务请求类 c) Static Method web 服务响应解析类 D) Static Method web 服务响应处理类
数据流是 A->B->C->D 类,从 D 类到 A 类,
*需要的是 B,C,D 在后台进程中
请让我知道如何编写源代码来解决这个问题?
请随意填写以提供任何其他替代方法解决此问题。
提前致谢。
由于至少网络操作本质上是异步的,因此您的问题可以被视为“常见的异步模式”:
当您想在异步操作 A 完成后立即执行异步操作 B 时,这称为“继续”。
有几种方法可以实现continuation。这取决于异步操作如何向调用站点发出“完成”或“错误”信号。
假设异步操作被包装到一个方法中,该方法的参数完成是一个块。在这种情况下,异步方法通过调用调用者提供的完成块发出完成信号,并将结果作为参数传递给块:
typedef void (^completion_t)(id result);
- (void) doSomethingAsync:(completion_t)completionHandler;
呼叫站点:
[self doSomethingAsync:^(id result){/* now, result is available */});
请注意,完成处理程序将由调用站点提供,并且一旦评估结果,异步操作将调用完成处理程序。
现在,为了调用第二个异步操作,该操作在第一个操作完成后立即被调用,您可以简单地在第一个的完成处理程序中调用它:
假设第二个异步方法需要一个输入,该输入必须由调用站点在参数input中提供:
- (void) doSomethingElseWithParam:(id)input
completion:(completion_t)completionHandler;
假设第二个异步方法将先前评估的结果作为输入。这是调用异步方法的调用站点doSomethingAsync:
,完成后它会调用doSomethingElseWithParam:completion:
. 最后,当第二个异步方法完成时,结果将打印到控制台:
[self doSomethingAsync:^(id result){
[self doSomethingElseWithParam:result completion:^(id finalResult) {
NSLog(@"Final result: %@", finalResult);
}]
});
以这种方式“链接”异步方法也称为“延续”。
当然,真正的实现会处理所有的错误检查。
还有其他方法可以实现这一点。这是一个带有完成块的示例。这种方法的一个缺点是,它变得难以实现取消。
另一种方法是使用NSOperation
的依赖特性(参见NSOperation
的addDependency:
方法(NSOperation 类参考)。NSOperation
对象可以很容易地取消。
还有一种方法使用Promise (参见 wiki:Futures and Promises),它表示异步操作的最终结果。(有一些实现 Promise 的 Objective-C 第三方库)。
您可以使用NSNotificationCenter服务进行回调。当您完成 D 类中的流程时,发送通知。在 A 类中添加/删除观察者
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[[NSNotificationCenter defaultCenter] addObserverForName:@"SyncCompleted" object:nil queue:nil usingBlock:^(NSNotification *note) {
[self loadRecordsFromCoreData];// Do smoething
}];
}
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"SyncCompleted" object:nil];
}
进程完成调用时在 D 类中
[[NSNotificationCenter defaultCenter] postNotificationName:@"SyncCompleted"
object:nil];
很难理解你在问什么,但是对于 iOS,当你在做大多数 Web 服务类型的工作时,我倾向于建议使用 AFNetworking 而不是自己滚动:https ://github.com/AFNetworking/ AF网络
它处理你通常关心的大部分事情,比如在主 NSOperationQueue 之外下载和进行委托处理等。
或者,如果你只关心 iOS7,新的 NSURLSession 类也让这些事情变得简单:https ://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSession_class/Introduction/Introduction.html
但是你应该很少需要自己滚动。