新的Objective-C/iOS場景。有經驗的PHP和C++。NSInvocationOperation調用方法,下載XML文件以便本地存儲
我使用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,getXML將起作用,但當我將其添加到隊列時,getXML不起作用。我很可能錯過了更大的圖景,而且在開始之前我還沒有完全理解所有的東西。我將不勝感激這方面的一些幫助。看起來無論你在C++,PHP等方面多麼出色,iOS編程都是非常困難的!
感謝您的回覆。我已經將'connectionDidFinishLoading'方法的邏輯轉移到'getXML'(在錯誤檢查後的'else'語句中,而不是在上面的代碼中添加)。運行後,該文件未被創建。我該如何處理'didReceiveData'方法中的邏輯? – sooper
對,我剛剛理解正確。我必須在getXML中使用'response'變量來代替'data'。非常感謝你的幫助。 – sooper
沒問題,接受的答案如何? :) – bensnider