Я пытаюсь загрузить набор файлов с веб-сервера с помощью NSURLConnection, но в момент, когда соединение создается, методы делегирования соединения никогда не запускаются и поэтому файл никогда не загружается , Я прочитал много ответов на SO и другие источники и попробовал исправления, которые были рекомендованы, но безрезультатно, что заставляет меня думать, что я совершил другую ошибку.Методы делегатов NSURLConnection не вызываются
У меня есть ViewController (InitViewController.m), который загружает метод другого класса,:
GetData *getDataInstance = [[GetData alloc] init];
[getDataInstance startUpdate];
GetData.m затем делает некоторые проверки и работает класс, отвечающий за получение файлов:
GetFiles *getFilesInstance = [[GetFiles alloc] init];
[getFilesInstance doFilesNeedDownloading];
doFilesNeedDowngoading метод проверяет, нужен ли нам файл, а затем запускается getFiles:
-(void)getFile//:(NSString *) fullURL
{
// I have checked if the connection is run on the main thread and it is
NSLog(@"Is%@ main thread", ([NSThread isMainThread] ? @"" : @" NOT"));
NSURL *downloadURL = [NSURL URLWithString:fullURL];
NSMutableURLRequest *dlRequest = [NSMutableURLRequest requestWithURL:downloadURL];
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:dlRequest delegate:self];
[theConnection scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[theConnection start];
if(theConnection) { //me checking for connection which is 'true'
NSLog(@"Connection for %@ worked", fullURL);
} else {
NSLog(@"Connection for %@ failed", fullURL);
}
}
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
responseData = [[NSMutableData alloc] init];
NSString *fileName = [[NSURL URLWithString:fullURL] lastPathComponent];
NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES) objectAtIndex:0]stringByAppendingPathComponent:fileName];
[[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];
file = [NSFileHandle fileHandleForUpdatingAtPath:filePath];
[file seekToEndOfFile];
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[responseData appendData:data];
[file seekToEndOfFile];
[file writeData:data];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
[file closeFile];
}
Первоначально я запускал startUpdate getDataInstance в отдельном потоке в обновлении, чтобы часть приложения «получать данные» отдельно от части «создания пользовательского интерфейса» в приложении и считала, что это может быть проблемой, но пока я удаляю что и даже вставить в '[theConnection scheduleInRunLoop: [NSRunLoop mainRunLoop] forMode: NSDefaultRunLoopMode]' в соответствии с другими ответами на этот вопрос на SO.
Я уверен, что будет что-то действительно очевидное, что я пропустил, любые идеи?
Спасибо,
EDIT
я сейчас попробовал этот код еще раз, но в initViewController, так что это в значительной степени первая вещь, которая вызывается, когда приложение нагрузки. Это уже не в другом классе или нить и т.п .:
-(void)getFile
{
fullURL = @"http://myURL.com/terms-and-conditions.txt";
NSURL *downloadURL = [NSURL URLWithString:fullURL];
NSMutableURLRequest *dlRequest = [NSMutableURLRequest requestWithURL:downloadURL];
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:dlRequest delegate:self];
[theConnection start];
}
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
responseData = [[NSMutableData alloc] init];
NSString *fileName = [[NSURL URLWithString:fullURL] lastPathComponent];
NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES) objectAtIndex:0]stringByAppendingPathComponent:fileName];
[[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];
file = [NSFileHandle fileHandleForUpdatingAtPath:filePath];
[file seekToEndOfFile];
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[responseData appendData:data];
[file seekToEndOfFile];
[file writeData:data];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
[file closeFile];
}
GetFile увольняют, но это делегат методы до сих пор не уволят?
Вы используете ARC? Если да, убедитесь, что объекты, подобные вашему GetData, и такие не определены слабые и освобождаются в конце цикла выполнения. – Volker
Я положил эту строку в качестве потенциального исправления (тот, который кто-то предложил в другом месте), удаление которого не помогает. – Ryan
@ Volker - я использую ARC. GetData - это отдельный класс, импортированный в .h из initViewController – Ryan