2012年1月6日 星期五

iOS學習_多個NSURLConnection的識別(利用accessibility等屬性)

如果進行稍微複雜一點的應用,就有可能在一個Class裡面使用多個NSURLConnection來連接不同的資料,但是根據這篇我們在使用NSURLConnection時會將各項處理交給相對應的delegate。

所以除非將各個delegate寫在不同的Class裡面,才有可能將這些要處理回應的程式碼分開,如果希望將處理的內容都寫在同一個delegate方法內處理,就必須要做一些識別。

NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:urlReq delegate:self];

也就是說上述程式碼的delegate都想寫在self內,那麼就必須在delegate內判斷目前傳來的NSURLConnection是誰?

方法一:將每一個NSURLConnection在一開始就實體化,於delegate內判斷為那一個connection傳進來。

NSURLConnection *conn1;
NSURLConnection *conn2;

-(void)doPost
{
conn1 = [[NSURLConnection alloc] initWithRequest:urlReq delegate:self];
}
-(void)doPost2
{
conn2 = [[NSURLConnection alloc] initWithRequest:urlReq delegate:self];
}

//取得資料時觸發
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
if (connection==conn1)
{
NSLog(@"didReceiveData SendInfo");
}
if (connection==conn2)
{
NSLog(@"didReceiveData SendInfo2");
}
}


但我們所建立的NSURLConnection其實只有在送出要求時才有用處,卻因為要比較目前誰被呼叫而一直佔用記憶體空間,所以就希望類似用tag的方式來判斷目前的NSURLConnection究竟為何者?來作出對應的處理。

方法二:NSURLConnection沒有所謂的tag屬性,但是他有大量的accessibility屬性,所以這邊就是利用其他屬性來達到tag的效果。

-(void)doPost
{
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:urlReq delegate:self];
[conn setAccessibilityLabel:@"SendInfo"];
[conn release];
}

-(void)doPost2
{
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:urlReq delegate:self];
[conn setAccessibilityLabel:@"SendInfo2"];
[conn release];
}

//取得資料時觸發
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
if ([[connection accessibilityLabel] isEqualToString:@"SendInfo"])
{
NSLog(@"didReceiveData SendInfo");
[httpPostResponse appendData:data];
}
if ([[connection accessibilityLabel] isEqualToString:@"SendInfo2"])
{
NSLog(@"didReceiveData SendInfo2");
[httpPostResponse appendData:data];
}
}


*在網路上沒有找到類似的說法,所以不確定accessibility這類屬性是否有預設一定要使用的時機,但不論如何,如此即可簡單地判斷傳入的NSURLConnection,若使用有意義的名稱更可讓程式碼可讀性增加,自認為是一個不錯的方案。

沒有留言:

張貼留言