gpt4 book ai didi

ios - 如何创建一个简单的 NSURLRequest 回调?

转载 作者:行者123 更新时间:2023-12-01 18:09:52 26 4
gpt4 key购买 nike

我创建了一个类,该类将从 url 数据中异步收集数据,但是我对回调或任何不清楚的理解,我试图通过让调用方法等待数据返回来找到一种简单的方法来重用我的类或在 ApiManager 类中设置。当该过程完成后,我只需要在另一个类(class)唤醒一些东西。有些进程有单个请求,而其他进程有多个,为什么您会注意到我在 ApiManager 类中使用 [连接描述]。

ApiManager.h

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>

@interface ApiManager : NSObject<NSURLConnectionDelegate>
{
NSMutableDictionary *_dataDictionary;
}
- (void)urlRequest:(NSURLRequest *)url;

@property (strong, nonatomic) NSMutableArray *results;

@end

ApiManager.m
#import "ApiManager.h"

@implementation ApiManager

- (void)urlRequest:(NSURLRequest *)url {
[[NSURLConnection alloc] initWithRequest:url delegate:self];
}

// basic connection classes
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
NSMutableData *responceOjb = _dataDictionary[ [connection description] ];
[_dataDictionary setObject:responceOjb forKey:[connection description]];
}
// append any data we find
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
NSMutableData *responceOjb = _dataDictionary[ [connection description] ];
[responceOjb appendData: data];
[_dataDictionary setObject:responceOjb forKey:[connection description]];
}
// --
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection
willCacheResponse:(NSCachedURLResponse*)cachedResponse {
// Return nil to indicate not necessary to store a cached response for this connection
return nil;
}
// wrap up and close the connect, move objects over to results or something
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
[_results addObject:[connection description]];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
// The request has failed for some reason!
// Check the error var
NSLog(@"%@",error);
}

@end

主视图 Controller 测试:
        #import "ViewController.h"
#import "ApiManager.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self DoThisTest];
}

-(void)DoThisTest {
ApiManager *api = [[ApiManager alloc] init];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",@"http://google.com"]]];
[api urlRequest:request];
if([api results]) {
NSLog(@"GOT DATA");
}
}

最佳答案

好吧,有几个选择。您可以在 ApiManager 类中添加一个 block 属性:

@property (copy, nonatomic) void (^doneHandler)();

然后像这样调用该 block :
self.doneHandler();

当您认为合适时(例如,在您的 connectionDidFinishLoading: 方法中),您将调用该 block 。

使用这种方法, block (回调)的定义将发生在您的 View Controller 中,看起来像:
ApiManager *apiManager = [[ApiManager alloc] init];
apiManager.doneHandler = ^{
// Do whatever you need to do here.
};

或者,您可以使用如下签名向您的 ApiManager 添加一个方法:
- (void)sendRequestWithURL:(NSURL*)url completion:(void(^)())completion;

并使用 NSURLConnection 的(或者更好的 NSURLSession 的)基于 block 的 API。这些 API 具有内置回调,您只需调用 completion(); -[NSURLSession sendAsynchronousRequest:completion:]. 的完成 block 内部

最后,您可以定义一个 ApiManagerDelegate 协议(protocol)。
- (void)apiManagerDidFinishReceivingData:(ApiManager*)sender;

并向您的 ApiManager 类添加一个委托(delegate)属性。
@property (weak, nonatomic) id<ApiManagerDelegate>delegate;

在 ViewController 中分配 ApiManager 的委托(delegate):
ApiManager *apiManager = [[ApiManager alloc] init];
apiManager.delegate = self;

在 ApiManager 中调用 NSURLConnectionDelegate 回调的实现内部的委托(delegate)方法,如下所示:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
[_results addObject:[connection description]];
[self.delegate apiManagerDidFinishReceivingData:self];
}

并在 ViewController 中实现委托(delegate)方法:
- (void)apiManagerDidFinishReceivingData:(ApiManager*)sender {
// Do what you want to.
}

作为附录,有一些可用的网络库可以为您完成大量繁重和忙碌的工作,最值得注意的是 AFNetworking ,如果你只是想把事情做好。而且,即使这更像是你试图理解模式的学术练习,查看 AFNetworking 的 API 和实现(它是开源的)也会很有启发性。

干杯

关于ios - 如何创建一个简单的 NSURLRequest 回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33682046/

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