1

目標 c に Controller と Connector の 2 つのクラスがあります。コントローラは、データを取得するために Web サービスへの接続を構築するようコネクタに要求します。接続自体はデリゲートで実装されます。このデリゲートは、データが到着した場合にメソッド呼び出しを取得します。デリゲートをコネクタ自体に設定しました。私の問題は、コントローラーでコネクターのメソッドを呼び出し、このメソッドがすぐにデータを返すことです。これは委任なしです。マルチスレッドを試してコントローラーで待機しましたが、単一のメソッドのマルチスレッドしか見つかりませんでした。

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

Connector クラス全体がスレッド化されていないため、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
4

2 に答える 2

3

ブロックを使うべきだと思います。

プロパティをConnector.h作成するcompletitionBlock

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

Connector.mで、どのようにWebサービスに接続するかわかりません。この例は、NSURLDelegate用です。

終了したらOK

-(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);   

}

次に、Controllerクラスからコネクタを呼び出します

[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
       }
    }];
于 2012-10-04T12:38:00.883 に答える
1

まず、NSThreadの代わりにGrandCentralDispatchを使用することをお勧めします。GCDはより最適化されており、より使いやすくなっています。

あなたの場合、メソッドが非同期ジョブを実行しているのに、なぜコネクタのメソッドの同期呼び出しを実行したいのかわかりませんが、それは非常に悪い考えだと思います。特に、コネクタがWebサービスへの接続を行っている場合。

代わりに、Webサービスへの同期接続を行っているコネクタのメソッドを非同期で呼び出すことをお勧めします。それはGCDで非常に簡単です

dispatch_async(myQueue, ^{

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

    dispatch_async(dispatch_get_main_queue(), ^{
        //update your UI
    });
});
于 2012-10-04T12:39:45.410 に答える