gpt4 book ai didi

objective-c - 使用 Objective-C block 的更好的异步控制流

转载 作者:IT老高 更新时间:2023-10-28 11:48:14 25 4
gpt4 key购买 nike

我正在使用 AFNetworking用于对 Web 服务的异步调用。其中一些调用必须链接在一起,其中调用 A 的结果由调用 B 使用,而调用 B 由调用 C 使用,等等。

AFNetworking 处理异步调用的结果,并在创建操作时设置成功/失败 block :

NSURL *url = [NSURL URLWithString:@"http://api.twitter.com/1/statuses/public_timeline.json"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
NSLog(@"Public Timeline: %@", JSON);
} failure:nil];
[operation start];

这会导致嵌套的异步调用 block 很快变得不可读。当任务不相互依赖而必须并行执行并且执行取决于所有操作的结果时,情况就更加复杂了。

似乎更好的方法是利用 promises清理控制流的框架。

我遇到了MAFuture但无法弄清楚如何最好地将其与 AFNetworking 集成。由于异步调用可能有多个结果(成功/失败)并且没有返回值,因此它似乎不是一个理想的选择。

任何指针或想法将不胜感激。

最佳答案

我为此创建了一个轻量级的解决方案。它被称为 Sequencer,它位于 github .

它使链接 API 调用(或任何其他异步代码)变得简单明了。

这是一个使用 AFNetworking 的示例:

Sequencer *sequencer = [[Sequencer alloc] init];

[sequencer enqueueStep:^(id result, SequencerCompletion completion) {
NSURL *url = [NSURL URLWithString:@"https://alpha-api.app.net/stream/0/posts/stream/global"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
completion(JSON);
} failure:nil];
[operation start];
}];

[sequencer enqueueStep:^(NSDictionary *feed, SequencerCompletion completion) {
NSArray *data = [feed objectForKey:@"data"];
NSDictionary *lastFeedItem = [data lastObject];
NSString *cononicalURL = [lastFeedItem objectForKey:@"canonical_url"];

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:cononicalURL]];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
completion(responseObject);
} failure:nil];
[operation start];
}];

[sequencer enqueueStep:^(NSData *htmlData, SequencerCompletion completion) {
NSString *html = [[NSString alloc] initWithData:htmlData encoding:NSUTF8StringEncoding];
NSLog(@"HTML Page: %@", html);
completion(nil);
}];

[sequencer run];

关于objective-c - 使用 Objective-C block 的更好的异步控制流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10915927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com