Iphone NSInvocationOperation调用将XML文件下载到本地存储的方法

Iphone NSInvocationOperation调用将XML文件下载到本地存储的方法,iphone,objective-c,ios,nsurlconnection,nsoperation,Iphone,Objective C,Ios,Nsurlconnection,Nsoperation,Objective-C/iOS场景的新功能。有PHP和C++经验。 我在使用NSInvocationOperation时遇到了一点问题。我的情况如下: 通过一些在线帮助,我创建了一个类getData.h,其中getData.m包含: #import "getData.h" @implementation getData @synthesize allData; -(void)loadData{ NSOperationQueue *queue = [NSOperationQueue new]

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编程都是一个很难的程序!p> 在
getXML
中,您正在执行一个同步请求,这意味着当该方法返回时,请求的整个数据都将在
响应
NSData变量中。当请求完成时,
sendSynchronousRequest
阻塞并返回,而不是等待连接完成委托方法的加载。同样地,
didReceiveData
delegate方法永远不会被调用


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

感谢您的响应。我已将逻辑从
connectiondFinishLoading
方法移动到
getXML
(在错误检查后的
else
语句中,而不是添加到上述代码中)。运行后,未创建该文件。我该如何处理
didReceiveData
方法中的逻辑?对,我刚刚正确理解了。我必须将它包含在getXML中,使用
响应
变量代替
数据
。非常感谢你的帮助。我也是堆栈溢出的新手!