gpt4 book ai didi

ios - 确保异步方法的执行顺序与它们被调用的顺序相同

转载 作者:行者123 更新时间:2023-11-28 21:29:11 25 4
gpt4 key购买 nike

假设我有 3 个异步方法,它们都做同样的事情:将一些数据发送到服务器并将响应数据添加到数组(所有这些都添加到同一个数组)。

我同时调用这些方法,但它们向服务器发送的数据量不同。

如果第一种方法向服务器发送的数据比第三种方法多,第三种方法会更快得到响应,从而更快地将数据添加到数组中。响应数据由坐标组成,因此它们在数组中的顺序很重要。

我如何确保即使第三种方法比第一种或第二种方法更早获得响应,它也不会在前面的方法之前将数据添加到数组中?因此,保留数组中坐标的顺序。

这些方法是 NSURLConnection,它们都发送一个异步请求。

编辑:这是工作代码:

 //Array of snapped points from the JSON
NSArray *snappedPoints = [result objectForKey:@"snappedPoints"];

NSMutableArray *locationsArray = [[NSMutableArray alloc] init];

//Loop through the snapped points array and add each coordinate to a temporary array
for (int i = 0; i<[snappedPoints count]; i++) {
NSDictionary *location = [[snappedPoints objectAtIndex:i] objectForKey:@"location"];

double latitude = [[location objectForKey:@"latitude"] doubleValue];
double longitude = [[location objectForKey:@"longitude"] doubleValue];

CLLocation *loc = [[CLLocation alloc] initWithLatitude:latitude longitude:longitude];

[locationsArray addObject:loc];

}


//Add these temporary location arrays to the dictionary with the key as the request number
[tempLocationDictionary setObject:locationsArray forKey:[NSString stringWithFormat:@"%i",requestNumber]];

//If all requests have completed get the location arrays from the dicitonary in the same order as the request were made
if([tempLocationDictionary count] == numberOfRequests){

//Just a path because I am drawing these coordinates on a map later
GMSMutablePath *path = [GMSMutablePath path];

//Loop through the dictionary and get the location arrays in the right order
for (int i = 0; i<[tempLocationDictionary count]; i++) {
//Create a dummy array
NSArray *array = [tempLocationDictionary objectForKey:[NSString stringWithFormat:@"%i",i+1]];

//Get the coordinates from the array which we just got from the dictionary
for (CLLocation *location in array) {
[path addCoordinate:location.coordinate];

}
}

最佳答案

一种方法是将 NSURLConnection 替换为 NSURLSession 及其相关类。它较新,通常是更好的选择。对于您的具体情况,可以使用自定义 NSURLSessionConfiguration,您可以在其中将 HTTPMaximumConnectionsPerHost 设置为 1。这样连接将被强制按顺序运行,从而解决您的问题。

当然,没有同时连接可能会减慢速度。在这种情况下,您必须暂时累积数据而不将其添加到您的数组中,并且仅在所有连接完成时才更新数组。根据从服务器返回的具体数据,您可以采用多种方式执行此操作。

一个相对简单的方法:如果你知道你总是有三个连接,使用一个 NSMutableDictionary 和整数 NSNumber 对象作为键。每次连接后你会做类似的事情

mutableDictionary[@1] = // your server data here

对其他连接使用@2@3。每次添加数据时,请检查是否有所有这三个数据的结果,如果有,请将所有数据添加到数组中。有很多其他方法可以解决这个问题,关键是要有某种临时结构,您可以在其中 (a) 累积数据直到所有连接都完成,以及 (b) 跟踪哪些数据来自哪个连接,或者简单地按编号、URL 或服务器提供的其他一些唯一数据。

关于ios - 确保异步方法的执行顺序与它们被调用的顺序相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36851516/

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