gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 23:11:02 25 4
gpt4 key购买 nike

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 编程都是一个难题!

最佳答案

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

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

关于iphone - NSInvocationOperation 调用下载 XML 文件以存储在本地的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8271580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com