2012-05-08 31 views
1

我已經創建了一個單例類,它應該處理爲我的應用程序加載的所有數據,所有數據都是從Web界面加載的,但是在不同的請求中加載。單身類加載數據

DataModel *instance = [[[DataModel instance] init] autorelease]; 
[instance doRequestFromLocation:@"users" withPostType:@"GET" andData:@"data"]; 
[instance doRequestFromLocation:@"timezones" withPostType:@"GET" andData:@"data"]; 

這將爲例如加載所有的用戶在一個請求,然後加載其他所有時區。

我的單例類看起來是這樣的:

// Send a curl request 
- (void)doRequestFromLocation:(NSString *)location withPostType:(NSString *)type andData:(NSString *)data 
{  
    // NSArray *keys = [NSArray arrayWithObjects:@"username", @"password", nil]; 
    // NSArray *objects = [NSArray arrayWithObjects:@"test", @"test", nil]; 
    // NSDictionary *theRequestDictionary = [NSDictionary dictionaryWithObject:objects forKey:keys]; 


    NSString *username = @"username"; 
    NSString *password = @"password"; 
    NSString *urlString = [url stringByAppendingFormat:@"%@", location]; 

    NSMutableString *loginString = (NSMutableString *)[@"" stringByAppendingFormat:@"%@:%@", username, password]; 
    NSLog(@"%@", loginString); 

    NSString *encodedLoginData = [Base64 encode:[loginString dataUsingEncoding:NSUTF8StringEncoding]]; 
    NSString *authHeader = [@"Basic " stringByAppendingFormat:@"%@",encodedLoginData]; 

    NSLog(@"%@", authHeader); 

    NSURL *url = [NSURL URLWithString:urlString]; 
    NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url]; 
    [theRequest setHTTPMethod:type]; 

    [theRequest setValue:authHeader forHTTPHeaderField:@"Authorization"]; 
    [theRequest setValue:@"application/xml" forHTTPHeaderField:@"Content-type"]; 
    [theRequest setValue:@"application/xml" forHTTPHeaderField:@"Accept"]; 

    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 
} 

#pragma mark - 
#pragma mark Responses 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    NSLog(@"didFailWithError"); 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    NSLog(@"%@", responseString); 
} 

- (void) connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSLog(@"connectionDidFinishLoading"); 
} 

雖然這一切工作正常,我對我的下一個步驟有點卡住了。

我希望能夠從任何地方調用doRequestFromLocation(現在可能),但我希望其他類可以響應它進入didReceiveData。

我在想我的數據模型將不知何故委託其他類?

+0

委託陣列可以處理這個問題,但你也檢查可可NSNotificationCenter和鍵 - 值觀察功能? –

+0

我剛剛嘗試NSNotificationCenter基於user523234回覆,它工作正常 –

回答

2

在這種情況下,您可以使用NSNotificationCenter。

+0

謝謝,剛剛嘗試過NSNotificationCenter,它的工作就像我想,謝謝! –

0

在iOS開發者庫中,有一個名爲MVCNetworking一個示例項目,http://developer.apple.com/library/ios/#samplecode/MVCNetworking/Introduction/Intro.html

其NetworkManager在一個單獨的類,將包的所有請求作爲的NSOperation,然後將其添加到NSOperationQueue。

所以它甚至可以管理網絡請求排隊,並在有限的併發計數處理。

僅供參考,這行代碼可能會導致內存泄漏:

NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 
+0

這爲什麼會導致問題?我還需要自動釋放它嗎? –

+1

對象'theConnection'由您分配,並且您沒有在任何地方釋放它。保留計數仍將保持爲1. – CardMaster

+0

也許您可以在完成或失敗時釋放連接。 – CardMaster