意外地调用相同的obj-C对象两次

时间:2009-08-04 15:56:02

标签: iphone objective-c

我想进行两次单独的异步互联网查找。然而,他们互相踩着,我不知道为什么。

当我四处寻找时,似乎两个查找都在同一个对象上运行(症状:第二个调用正在重置第一次调用设置的“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];
}   
}

2 个答案:

答案 0 :(得分:4)

你说thisPage是一个模块级变量。我认为这意味着它不是一个实例变量。如果是这种情况,则thisPage的所有实例之间只共享一个CSNet变量。当然,如果你有两个同时运行,它们会相互冲突。

如果您确实希望CSNet的每个实例都有自己的thisPage变量,那么请将其设为实例变量。

答案 1 :(得分:2)

您可以跟踪向委托发送方法的对象,并在同一委托对象中明确地处理这两个连接。如果查看委托方法(如-connection:didReceiveResponse:)的方法签名,则第一个参数是发送消息的连接。在您的情况下,这将是您通过两次调用-getPage:page:创建的两个对象之一。因此,跟踪这些对象,并测试哪一个导致委托方法被调用。