2012-10-04 136 views
1

我在目標c中有兩個類控制器和連接器。控制器要求連接器建立到web服務的連接以獲取一些數據。連接本身是通過委託來實現的。如果數據到達,這個委託會得到一個方法調用。我將委託設置爲連接器本身。 我的問題是我想要控制器調用連接器上的方法,並且此方法立即返回數據。這沒有授權。 我嘗試了多線程和Controller等待,但我只能找到多線程的單一方法:等待在iOS中完成的方法

[NSThread detachNewThreadSelector:@selector(myMethod) toTarget:myClass withObject:nil]; 

多線程的單一方法是不行的,因爲在連接器的委託方法不能被稱爲,因爲整個Connector類不是線程的。任何人都可以幫我解決這個問題嗎?

編輯:我想補充,我調用接口方法的代碼(這是代碼從控制器):

_data = nil; 
dispatch_queue_t myQueue = dispatch_queue_create("my queue", NULL); 
dispatch_async(myQueue, ^{ 
    _data = [_soapConnector startRequestWithSOAPMessage:soapMessage]; 
}); 

while(!_data){ 
    NSLog(@"waiting"); 
} 
//data arrived successfully here so we can manipulate it 

回答

1

首先,我建議你使用大中央調度,而不是NSThread方式。 GCD更優化,更易於使用。

在你的情況,我不知道你爲什麼要做連接器方法的同步調用,而你的方法正在做一個異步作業,但我認爲這是一個非常糟糕的主意。 特別是如果您的連接器正在連接到web服務。

我建議你改用連接器的方法進行異步調用,它與您的webservice進行同步連接。這是非常簡單的GCD

dispatch_async(myQueue, ^{ 

    NSData* data = [NSURLConnection sendSynchronousRequest:myRequest returningResponse:&response error:&error]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     //update your UI 
    }); 
}); 
+0

我用你的代碼建議更新了我的問題。但是這沒有幫助。在請求運行期間,我無法在文本字段中輸入任何內容,並且在數據到達之前用戶界面不工作。 – tester

+0

是的,因爲你的while指令正在主隊列上執行! – iSofTom

+0

如果讓線程在while循環中休眠,我可以解決這個問題嗎?我認爲它必須是主線程以外的另一個線程,對嗎? – tester

3

我認爲你應該使用塊。

在你Connector.h創建財產

@property (nonatomic,copy)void (^completitionBlock) (id obj, NSError * err); 

在connector.m我不知道你是怎麼連接到web服務,這個例子是NSURLDelegate

如果完成確定

-(void)connectionDidFinishLoading:(NSURLConnection *)connection { 

     if([self completitionBlock]) 
      [self completitionBlock](dataOK,nil); 

} 

NSMutableData * dataOK是收到的數據

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [dataOK appendData:data]; 
} 

如果失敗

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 

    if([self completitionBlock]) 
     [self completitionBlock](nil,error); 

} 

再從控制器類調用接口

[Connector getWebservice:^(id obj, NSError *err) { 
     if (!err) { 

      //Code executed when the webservice finish OK, obj will be the dataOK 


     } else { 

      //Code executed when the webservice return error 
     } 
    }]; 
+0

我確切地使用這種方法來連接到webservice(NSURLConnection)。但是,我該如何處理getWebservice方法中的塊?在getWebservice方法中,我通過以下方式啓動請求:_connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; – tester

+0

是的,您只需使用getWebservice方法初始化與請求的連接,並且所有方法都可以工作。啊,你也應該在這裏初始化數據,dataOK = [[NSMutableData alloc] init]; – jcesarmobile

+0

你的解決方案也在工作,但我檢查了另一個答案,因爲最終它是我選擇的方式;-)因此我投票支持你。 – tester