2011-02-09 4 views
1

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

Когда я запускаю это в симуляторе 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]; 
+0

первую очередь запустить свой код с профилировщика. – Max

ответ

1

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

  • Вы генерация 20MB случайных данных, это будет иметь возраст на устройстве IOS :)
  • Вы держите эту 20MB в памяти, которая немного памяти интенсивно на устройстве IOS. Вам лучше сохранить его в файл.
  • Вы также настраиваете корпус вручную, который просто не нужен. Я бы рекомендовал использовать ASIFormDataRequest и даже не используя NSData и используя AddFile ASIFormDataRequest в: withFileName: andContentType: forKey:
+0

Хорошие моменты, но на самом деле это не отвечает на вопрос о том, почему POST так медленно. Как только данные создаются (однако они создаются), сама фактическая запись сканируется. Есть ли что-то, что я делаю неправильно, чтобы объяснить это? Кроме того, как уже упоминалось, я настраиваю тело вручную, чтобы точно соответствовать существующей реализации. – Bama91

+0

Помимо того, что я точно говорю, почему он медленный, потому что вы генерируете 20 МБ случайных данных на медленном устройстве, а затем вручную копируете это в другую NSMutableData. Используйте файлы и ASIFormDataRequest. –

+0

Спасибо. Я не собирался отклонять ваш вклад. Я просто предполагал, что это не было основной причиной, потому что время, необходимое для достижения NSURLConnection initWithRequest, очень быстро. Время после этого (сам пост) происходит очень медленно. Я попробую вашу рекомендацию и посмотрю, что произойдет. – Bama91

Смежные вопросы