我想进行两次单独的异步互联网查找。然而,他们互相踩着,我不知道为什么。
当我四处寻找时,似乎两个查找都在同一个对象上运行(症状:第二个调用正在重置第一次调用设置的“thisPage”)。
也许这与委托使用有关(在这个领域仍然不太舒服)?
我创建了一个CSNet类并对其进行了初始化:
CSNet *startupPage;
CSNet *positionUpdatePage;
startupPage = [[CSNet alloc] init];
positionUpdatePage = [[CSNet alloc] init];
稍后,我尝试使用每个对象:
[startupPage getPage:self page:pageName];
和
[positionUpdatePage getPage:self page:pageName];
模块级变量:
enum pageType {nothing, startup, positionUpdate, acquireOpponents, fire, changeCredentials};
enum pageType thisPage;
getPage call:
-(void)getPage:(id)delegate page:(NSString *)page {
m_Delegate = delegate;
if ([[page substringToIndex:2] isEqual:@"st"]) {
thisPage = startup;
} else {
if ([[page substringToIndex:2] isEqual:@"pu"]) {
thisPage = positionUpdate;
} else {
if ([[page substringToIndex:2] isEqual:@"ao"]) {
thisPage = acquireOpponents;
} else {
if ([[page substringToIndex:2] isEqual:@"fi"]) {
thisPage = fire;
} else {
if ([[page substringToIndex:2] isEqual:@"cc"]) {
thisPage = changeCredentials;
}
}
}
}
}
NSURLRequest *startupRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:[
[NSString stringWithFormat: @"%@%@", SERVER, page]
stringByReplacingOccurrencesOfString:@" " withString:@"%20"]]];
startupConnection = [[NSURLConnection alloc] initWithRequest:startupRequest delegate:self];
if(startupConnection)
{
workInProgress = YES;
m_RequestData = [[NSMutableData data] retain];
}
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
// this method is called when the server has determined that it
// has enough information to create the NSURLResponse
// it can be called multiple times, for example in the case of a
// redirect, so each time we reset the data.
// receivedData is declared as a method instance elsewhere
[m_RequestData setLength:0];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// append the new data to the receivedData
// receivedData is declared as a method instance elsewhere
[m_RequestData appendData:data];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
// release the data object
[m_RequestData release];
// inform the user
NSLog(@"Connection failed! Error - %@ %@", [error localizedDescription], [[error userInfo] objectForKey:NSErrorFailingURLStringKey]);
workInProgress = NO;
}
返回代表:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
if(workInProgress == YES) {
workInProgress = NO;
switch (thisPage) {
case startup:
//if ([m_Delegate respondsToSelector:@selector(startupReady:)])
[m_Delegate startupReady:m_RequestData];
break;
case positionUpdate:
//if ([m_Delegate respondsToSelector:@selector(positionUpdateReady:)])
[m_Delegate positionUpdateReady:m_RequestData];
break;
case acquireOpponents:
//if ([m_Delegate respondsToSelector:@selector(opponentsReady:)])
[m_Delegate opponentsReady:m_RequestData];
break;
case fire:
//if ([m_Delegate respondsToSelector:@selector(fireReady:)])
[m_Delegate fireReady:m_RequestData];
break;
case changeCredentials:
//if ([m_Delegate respondsToSelector:@selector(changeCredentialsReady:)])
[m_Delegate changeCredentialsReady:m_RequestData];
break;
default:
break;
}
[m_RequestData release];
}
}
答案 0 :(得分:4)
你说thisPage
是一个模块级变量。我认为这意味着它不是一个实例变量。如果是这种情况,则thisPage
的所有实例之间只共享一个CSNet
变量。当然,如果你有两个同时运行,它们会相互冲突。
如果您确实希望CSNet
的每个实例都有自己的thisPage
变量,那么请将其设为实例变量。
答案 1 :(得分:2)
您可以跟踪向委托发送方法的对象,并在同一委托对象中明确地处理这两个连接。如果查看委托方法(如-connection:didReceiveResponse:
)的方法签名,则第一个参数是发送消息的连接。在您的情况下,这将是您通过两次调用-getPage:page:
创建的两个对象之一。因此,跟踪这些对象,并测试哪一个导致委托方法被调用。