NSInvocationOperation для вызова метода, который загружает файл XML для локального хранения - PullRequest
0 голосов
/ 25 ноября 2011

впервые в сцене Objective-C / iOS. Опыт работы в PHP и C ++.

У меня небольшие проблемы с использованием NSInvocationOperation. Вот моя ситуация:

С некоторой помощью онлайн у меня есть класс getData.h, где getData.m содержит:

#import "getData.h"

@implementation getData

@synthesize allData;

-(void)loadData{
NSOperationQueue *queue = [NSOperationQueue new];
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self                                                                         selector:@selector(getXML) object:nil];

[queue addOperation:operation];
[operation release];
}


-(void)getXML{
NSURL *url = [NSURL URLWithString:@"http://tubeupdates.com/rss/all.xml"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[NSURLConnection connectionWithRequest:request delegate:self];

NSError *requestError;
NSURLResponse *urlResponse = nil;
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&requestError];
if (response == nil) {
    // Check for problems
    if (requestError != nil) {
        NSLog(@"Error!");
        }
    }  
}

-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
if (allData)
    [allData appendData:data];
else 
    allData = [[NSMutableData alloc] initWithData:data];
}


-(void) connectionDidFinishLoading:(NSURLConnection *)connection {
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *fullName = [NSString stringWithFormat:@"feed.xml"];
NSString *fullFilePath = [NSString stringWithFormat:@"%@/%@",docDir,fullName];
[allData writeToFile:fullFilePath atomically:YES];
}

-(void)dealloc{
[allData release];
[super dealloc];
}

@end

Я знаю, что метод вызывается в очередь, так как я сделал временный «printthis» метод для его вызова, который просто отображал некоторый текст с NSLog. Однако моя проблема возникает при попытке вызвать функцию getXML (чтобы скопировать файл XML с сервера). getXML работает, если я вызываю его напрямую, но не добавляет его в очередь. Вполне вероятно, что мне не хватает общей картины, и я не до конца понял все, прежде чем начал. Я был бы признателен за помощь в этом. Кажется, неважно, насколько вы хороши в C ++, PHP и т. Д. Программирование на iOS - сложная задача!

1 Ответ

2 голосов
/ 25 ноября 2011

В getXML вы выполняете синхронный запрос, что означает, что при возврате метода все данные для запроса будут находиться в вашей переменной response NSData.Вместо ожидания завершения загрузки соединения с помощью метода делегата, sendSynchronousRequest блокируется и возвращается после завершения запроса.Точно так же ваш метод делегата didReceiveData никогда не будет вызван.

Итак, чтобы решить вашу проблему, просто возьмите логику завершения, которая в настоящее время используется в методе connectionDidFinishLoading, и переместите ее в метод getXML послесинхронный вызов возвращается.

...