gpt4 book ai didi

ios - 如何下载 JSON 数据并在 iOS 的后台线程中处理它?

转载 作者:行者123 更新时间:2023-12-01 17:33:25 25 4
gpt4 key购买 nike

我需要下载 JSON 并在 iOS5 的后台处理它,所以我不会卡住我的主线程。我这样做没有任何成功。

这是我正在做的事情:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{

NSURL *url = [NSURL URLWithString:myURL];
myData = [NSData dataWithContentsOfURL:url];

[self performSelectorOnMainThread:@selector(processTheData:)
withObject:myData
waitUntilDone:YES];
});

-(void)processTheData:(NSData *)data
{
//Parse JSON here
}

在上面的代码中,一旦下载完成,我会在 Main thrd 上处理它。当我知道我得到数据时,如何在后台运行它?

最佳答案

典型的模式是:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{

NSURL *url = [NSURL URLWithString:myURL];
myData = [NSData dataWithContentsOfURL:url];

dispatch_async(dispatch_get_main_queue(), ^{
[self processTheData:myData];
});
});

或者,假设 processTheData不做 UI 更新本身,但你想在你完成后这样做,典型的方法是在你需要更新用户界面之前不要分派(dispatch)回主队列:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{

NSURL *url = [NSURL URLWithString:myURL];
myData = [NSData dataWithContentsOfURL:url];

[self processTheData:myData];

dispatch_async(dispatch_get_main_queue(), ^{
// code that updates UI goes here
});
});

最后,如果您对上述代码进行少量调用,那很好,但如果您可能会执行大量请求,您应该知道许多服务器限制了它们将接受的并发请求的数量从给定的客户。即使服务器没有,您也确实想限制您对服务器发出的并发请求数。如果您使用 NSOperationQueue,您可以轻松做到这一点。而不是 GCD。

因此,如果您正在执行多个异步请求,您可能需要执行以下操作(使用第二个示例作为模型)。首先,在您开始发起请求之前,您应该创建一个 NSOperationQueue目的:
@property (nonatomic, strong) NSOperationQueue *queue;

- (void)viewDidLoad
{
[super viewDidLoad];

self.queue = [[NSOperationQueue alloc] init];
self.queue.maxConcurrentOperationCount = 4;
}

然后,您必须执行单个异步请求的代码将:
[self.queue addOperationWithBlock:^{

NSURL *url = [NSURL URLWithString:myURL];
myData = [NSData dataWithContentsOfURL:url];

[self processTheData:myData];

[[NSOperationQueue mainQueue] addOperationWithBlock:{
// code that updates UI goes here
}];
}];

关于ios - 如何下载 JSON 数据并在 iOS 的后台线程中处理它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12763239/

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