NSInvocationOperation调用下载XML文件以在本地存储的方法

时间:2011-11-25 16:04:09

标签: iphone objective-c ios nsurlconnection nsoperation

Objective-C / iOS场景的新手。有PHP和C ++经验。

我在使用NSInvocationOperation时遇到了一些麻烦。这是我的情况:

在网上提供一些帮助,我是一个getData.m包含的类getData.h:

#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就可以工作,但是当我将它添加到Queue时却没有。我很可能错过了更大的图景,而且在我开始之前我还没有完全理解一切。我将不胜感激。看来无论你在C ++,PHP等方面有多好,iOS编程都很难!

1 个答案:

答案 0 :(得分:2)

getXML中,您正在执行同步请求,这意味着当方法返回时,请求的整个数据将位于response NSData变量中。 sendSynchronousRequest阻止而不是等待连接完成使用委托方法加载,并在请求完成时返回。同样,您的didReceiveData委托方法永远不会被调用。

因此,要解决您的问题,只需获取当前connectionDidFinishLoading方法中的完成逻辑,并在同步调用返回后将其移至getXML方法。