2011-11-25 74 views
0

新的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編程都是非常困難的!

回答

2

getXML你正在做一個同步請求,這意味着在方法返回時,該請求的整個數據將在您的response NSData的變量。而不是等待連接完成使用委託方法加載,sendSynchronousRequest阻止並在請求完成時返回。同樣,你的didReceiveData委託方法永遠不會被調用。

因此,要解決您的問題,只需採用當前在connectionDidFinishLoading方法中的完成邏輯,並在同步調用返回後將其移至getXML方法。

+0

感謝您的回覆。我已經將'connectionDidFinishLoading'方法的邏輯轉移到'getXML'(在錯誤檢查後的'else'語句中,而不是在上面的代碼中添加)。運行後,該文件未被創建。我該如何處理'didReceiveData'方法中的邏輯? – sooper

+0

對,我剛剛理解正確。我必須在getXML中使用'response'變量來代替'data'。非常感謝你的幫助。 – sooper

+0

沒問題,接受的答案如何? :) – bensnider

相關問題