0

我的问题如下,

我有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

3 回答 3

1

由于至少网络操作本质上是异步的,因此您的问题可以被视为“常见的异步模式”:

当您想在异步操作 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的依赖特性(参见NSOperationaddDependency:方法(NSOperation 类参考)。NSOperation对象可以很容易地取消。

还有一种方法使用Promise (参见 wiki:Futures and Promises),它表示异步操作的最终结果。(有一些实现 Promise 的 Objective-C 第三方库)。

于 2013-10-08T08:28:40.227 回答
1

您可以使用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];
于 2013-10-08T05:53:12.017 回答
1

很难理解你在问什么,但是对于 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

但是你应该很少需要自己滚动。

于 2013-10-08T05:53:37.903 回答