1

我在目标 c 中有两个类 Controller 和 Connector。控制器要求连接器建立与 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中不知道怎么连接webservice,这个例子是针对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);   

}

然后从 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

首先,我建议您使用 Grand Central Dispatch 而不是 NSThread 方式。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 回答