Почему мой NSURLConnection такой медленный? - PullRequest
1 голос
/ 09 февраля 2011

Я настроил NSURLConnection, используя рекомендации из Используя NSURLConnection из Справочной библиотеки Mac OS X, создав NSMutableURLRequest в виде POST для сценария PHP с пользовательским телом для загрузки 20 МБ данных (см. Код ниже). Обратите внимание, что тело сообщения - это то, чем оно является (разрывы строк и все), чтобы точно соответствовать существующей реализации рабочего стола.

Когда я запускаю это в симуляторе iPhone, публикация успешна, но занимает на порядок дольше, чем если бы я запускал эквивалентный код локально на моем Mac в C ++ (20 минут против 20 секунд, соответственно).

Есть идеи, почему разница настолько существенна? Я понимаю, что симулятор даст результаты, отличные от реального устройства, но я бы ожидал, по крайней мере, аналогичные результаты.

Спасибо

const NSUInteger kDataSizePOST = 20971520;
const NSString* kUploadURL = @"http://WWW.SOMEURL.COM/php/test/upload.php";
const NSString* kUploadFilename = @"test.data";
const NSString* kUsername = @"testuser";
const NSString* kHostname = @"testhost";

srandom(time(NULL));
NSMutableData *uniqueData = [[NSMutableData alloc] initWithCapacity:kDataSizePOST];
for (unsigned int i = 0 ; i < kDataSizePOST ; ++i) {
    u_int32_t randomByte = ((random() % 95) + 32);
    [uniqueData appendBytes:(void*)&randomByte length:1];
}

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:kUploadURL]];
[request setHTTPMethod:@"POST"];

NSString *boundary = @"aBcDd";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];

NSMutableData *postbody = [NSMutableData data];
[postbody appendData:[[NSString stringWithFormat:@"--%@\nContent-Size:%d",boundary,[uniqueData length]] dataUsingEncoding:NSUTF8StringEncoding]];
[postbody appendData:[[NSString stringWithFormat:@"\nContent-Disposition: form-data; name=test; filename=%@", kUploadFilename] dataUsingEncoding:NSUTF8StringEncoding]];
[postbody appendData:[[NSString stringWithString:@";\nContent-Type: multipart/mixed;\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];

[postbody appendData:[NSData dataWithData:uniqueData]];

[postbody appendData:[[NSString stringWithFormat:@"--%@\nContent-Size:%d",boundary,[kUsername length]] dataUsingEncoding:NSUTF8StringEncoding]];
[postbody appendData:[[NSString stringWithFormat:@"\nContent-Disposition: inline; name=Username;\n\r\n%@",kUsername] dataUsingEncoding:NSUTF8StringEncoding]];
[postbody appendData:[[NSString stringWithFormat:@"--%@\nContent-Size:%d",boundary,[kHostname length]] dataUsingEncoding:NSUTF8StringEncoding]];
[postbody appendData:[[NSString stringWithFormat:@"\nContent-Disposition: inline; name=Hostname;\n\r\n%@",kHostname] dataUsingEncoding:NSUTF8StringEncoding]];
[postbody appendData:[[NSString stringWithFormat:@"\n--%@--",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

[request setHTTPBody:postbody];

NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
if (theConnection) {
    _receivedData = [[NSMutableData data] retain];
} else {
    // Inform the user that the connection failed.
}

[request release];
[uniqueData release];

1 Ответ

1 голос
/ 09 февраля 2011

ОК, здесь пара вещей не так.

  • Вы генерируете 20 МБ случайных данных, это займет много времени на устройстве iOS:)
  • Вы сохраняете эти 20 МБ в памяти, что требует мало памяти на устройстве iOS. Тебе лучше сохранить его в файл.
  • Вы также настраиваете тело вручную, что просто не нужно. Я бы рекомендовал использовать ASIFormDataRequest и даже не использовать NSData и использовать addFile ASIFormDataRequest: withFileName: andContentType: forKey:
...