Вам нужно подождать, пока соединение не сообщит вам, что оно установлено, прежде чем вы сможете записать данные. Соединение обрабатывается в другом потоке; если вы попытаетесь немедленно получить доступ к данным в исходном потоке, в этом ничего не будет.
Вы должны переместить вызов writeToFile:
в конец connectionDidFinishLoading:
или в другой метод, который вы вызываете оттуда. Это первый момент, когда вы знаете, что все данные были собраны.
Я бы также предложил создать экземпляр NSMutableData
в didRecieveResponse:
, чтобы вы знали, что он доступен в нужное время. Это будет более читабельным / понятным. Вы можете думать о методах делегатов как о коллективной «области видимости» - данные используются только внутри них, поэтому их следует создавать внутри одного из них.
В ответ на ваш комментарий:
Одна из возможностей, поскольку у вас есть так много, что нужно сделать для этой загрузки, и, кажется, что вы не затрагиваете GUI, это запустить весь метод parsingComplete:
в фоновом потоке и использовать +[NSURLConnection sendSynchronousRequest:returningResponse:error:]
. Таким образом, ваш код будет просто ждать, пока данные не вернутся, одним куском, и вы можете написать его сразу после возврата вызова sendSynchronous...
.
NSError * err;
NSURLResponse * response;
NSData * receivedData = [NSURLConnection sendSynchronousRequest:imageRequest
returningResponse:&response
error:&err];
if( !receivedData ){
/* Handle error */
}
/* Check response */
BOOL result = [receivedData writeToFile:fileOut atomically:YES];
/* check result, etc. */