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编程都很难!
答案 0 :(得分:2)
在getXML
中,您正在执行同步请求,这意味着当方法返回时,请求的整个数据将位于response
NSData变量中。 sendSynchronousRequest
阻止而不是等待连接完成使用委托方法加载,并在请求完成时返回。同样,您的didReceiveData
委托方法永远不会被调用。
因此,要解决您的问题,只需获取当前connectionDidFinishLoading
方法中的完成逻辑,并在同步调用返回后将其移至getXML
方法。