Я использую AFNetworking для всего моего общения с моим сервером, все помещается в отдельный класс под названием «APIConnector».AFNetworking 3 Async download download queue
Я пытаюсь загрузить пользователя. Когда у меня есть идентификатор пользователя, я могу создать URL-адрес, но я не знаю, какие пользователи я получаю с сервера, прежде чем я их получу. Код, который я сейчас выглядит следующим образом:
AFHTTPSessionManager *httpManager = [AFHTTPSessionManager manager];
AFHTTPSessionManager *imageManager = [AFHTTPSessionManager manager]; //Used for posting to the server
[httpManager POST:url parameters:dict progress:nil
success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
UIImageView *imageHolder = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"placeholder"]];
if (isUser) {
NSMutableArray *users = [NSMutableArray new];
int i = 1;
for (id userResult in responseObject) {
User *user = [[User alloc] initWithId:[userResult valueForKey:@"index"] name:[userResult valueForKey:@"name"]];
user.imageURL = [NSString stringWithFormat:@"%@/image/?index=%@&imgIndex=0",backendURL,user.userID];
[users addObject:user];
if (i == [responseObject count]) {
success(users);
}
i++;
}
Я сделал несколько итераций меняется несколько вещей, попробовав его, как это, а также, как это, но с операциями:
AFHTTPSessionManager *imageManager = [AFHTTPSessionManager manager]; //Used for posting to the server
[httpManager POST:url parameters:dict progress:nil
success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
UIImageView *imageHolder = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"placeholder"]];
if (isUser) {
NSMutableArray *users = [NSMutableArray new];
int i = 1;
for (id userResult in responseObject) {
User *user = [[User alloc] initWithId:[userResult valueForKey:@"index"] name:[userResult valueForKey:@"name"]];
user.imageURL = [NSString stringWithFormat:@"url to image"];
[users addObject:user];
if (i == [responseObject count]) {
success(users);
}
i++;
}
NSMutableArray *usersWithImage = [NSMutableArray new];
for (int i = 0; i < users.count;i++) {
User *userImg = [users objectAtIndex:i];
NSString *imageURL = [NSString stringWithFormat:@"%@/image/?index=%@&imgIndex=0",backendURL,userImg.userID];
imageManager.responseSerializer = [AFImageResponseSerializer serializer];
[imageManager GET:imageURL parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable imgResponse) {
User *user = userImg;[users objectAtIndex:i];
user.profilePic.image = imgResponse;
[usersWithImage addObject:user];
if (i == users.count-1) {
success(usersWithImage);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"Error: %@",error);
}];
It ' «работает»», но он просто загружает последнее изображение как все изображения, я также пытался: https://github.com/robertmryan/AFHTTPSessionOperation/ же результат
EDIT/ADD:
NSMutableArray *users = [NSMutableArray new];
dispatch_group_t group = dispatch_group_create();
for (id acResult in responseObject) {
User *user = [[User alloc]initWithId:[acResult valueForKey:@"index"] name:[acResult valueForKey:@"name"]];
NSString *imageURL = [NSString stringWithFormat:@"%@/image/?index=%@&imgIndex=0",backendURL,user.userID];
dispatch_group_enter(group);
[imageManager GET:imageURL parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
user.imageData = UIImageJPEGRepresentation(responseObject, 1);
[users addObject:user];
dispatch_group_leave(group); // leave if successful
}
failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"Error: %@",error);
dispatch_group_leave(group); // leave if not
}];
}
dispatch_group_notify (group, dispatch_get_main_queue(),^{ успех (деятельность); // Это никогда не называется }); Также у меня есть контроль над количеством пользователей (только 10 за звонок), но я не знаю, какой у них идентификатор.
Когда вы говорите «просто загружает последнее изображение», подтвердили ли вы, сколько раз «GET» вызывается внутри цикла 'for'? Кроме того, что такое 'profilePic' внутри объекта' User'? Похоже, что это может быть образ, но вы действительно не должны иметь объекты пользовательского интерфейса внутри вашей модели. – Rob
Кстати, где установлен 'userID'. Я не вижу, чтобы вы установили это при загрузке списка пользователей. Итак, как это узнать, что использовать значение 'userID'? – Rob
Последнее замечание: я бы посоветовал проверить инструмент, подобный [Charles] (http://charlesproxy.com), который полезен при диагностировании подобных проблем. Вы можете просматривать запросы и ответы в независимом инструменте, и это позволяет легко идентифицировать источник проблемы. – Rob