Загрузка файла Cocoa с индикатором выполнения


(это действительно двойной удар с точки зрения вопросов, так как на самом деле есть два последовательных вопроса, но они как бы принадлежат друг другу.)

Первый Вопрос:

Как я могу загрузить файл (у меня уже есть объект NSData, содержащий содержимое файла) с помощью POST, отображая прогресс загрузки в NSProgressIndicator? Примерно так же можно сделать bytesReceived в NSURLDownload, но на этот раз отслеживая, сколько байтов уже было отправлено с помощью POST.

Второй Вопрос:

Пока у меня есть этот массив NSData, я буду использовать приведенный ниже код для отправки массива NSData. Здесь меня смущает, как бы я сказал ему, что, например, значение POST 'file' является объектом NSData. NSDictionary вероятно, сделал бы эту работу здесь, но у меня нет доступа к моему компьютеру и прекрасным документам Apple прямо сейчас.:

NSMutableURLRequest* post = [NSMutableURLRequest requestWithURL: [NSURL URLWithString:@"http://yourdomain.com/post.php"]];

[post setHTTPMethod: @"POST"];

[post setHTTPBody:myFileNSData];

NSURLResponse* response;

NSError* error;

NSData* result = [NSURLConnection sendSynchronousRequest:post returningResponse:&response error:&error];

NSLog(@"%@", [[[NSString alloc] initWithData:result encoding:NSASCIIStringEncoding] autorelease]);
Я был бы признателен за любую помощь.
2   2  

2 ответа:

Примечание-к сожалению, этот пост представляет только исторический интерес, поскольку, к сожалению, ASIHttpRequest прекратил свое развитие через несколько лет. Трагедия для общества.

Лучший ответ на сегодняшний день (2014): "просто, вы должны использовать одну из библиотек, доступных для этого."

Было бы, в буквальном смысле, безумием "свернуть свой собственный", когда есть совершенные библиотеки, с буквально 10 + человеко-лет развития позади них. Итак, найдите библиотеку (к сожалению, уже не ASIHttpRequest!) Надеюсь, это поможет!


Просто используйте ASIHttpRequest. Это самая используемая библиотека во всей iOS и обычная сетевая библиотека на Mac.

Отслеживание хода выполнения встроено. Он совершенно тривиален в использовании.

Не забудьте сделать маленькое пожертвование парню, если сможете - если он перестанет развивать его, мы все набьемся!

Если вы хотите использовать только какао для этого (и я согласен, что ASIHTTPRequest превосходен), вам нужно будет сделать сообщение асинхронно. Пример кода, который вы разместили здесь, является синхронным.

Это просто означает, что вам нужно будет реализовать некоторые методы делегирования NSURLConnection для обработки информации о том, как выполняется ваша загрузка. В частности, реализация метода connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite: позволит вам обновлять прогресс в вашем пользовательском интерфейсе.