Rest 等待URL连接块完成

Rest 等待URL连接块完成,rest,nsurlconnection,objective-c-blocks,semaphore,nsthread,Rest,Nsurlconnection,Objective C Blocks,Semaphore,Nsthread,我正在为我的iPad应用程序创建一个REST客户端类。因此,我创建了一个BOOL方法,该方法使用我先前创建的NSURLConnection子类进行登录 此JWURLConnection具有finishLoading和failWithError操作的块类型属性 问题是URL连接很可能在该方法完全执行后完成(或失败)。A无法使用额外的方法来使用性能选择器:waitUntilDone:,因为我必须等待连接 现在我尝试使用普通的C信号量和一个额外的线程(这样信号量只阻塞RESTClient线程,而不是U

我正在为我的iPad应用程序创建一个REST客户端类。因此,我创建了一个
BOOL
方法,该方法使用我先前创建的NSURLConnection子类进行登录

此JWURLConnection具有finishLoading和failWithError操作的块类型属性

问题是URL连接很可能在该方法完全执行后完成(或失败)。A无法使用额外的方法来使用
性能选择器:waitUntilDone:
,因为我必须等待连接

现在我尝试使用普通的C信号量和一个额外的线程(这样信号量只阻塞RESTClient线程,而不是URLConnections线程),但没有成功;该方法开始等待,但整个连接内容被冻结,因此没有来自连接的NSLog

JWURLConnection在
-start
方法中自行启动自己的线程:

- (void)start { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [super start]; }); }
下面是我试用过的代码(使用信号量):

我希望你能指引我正确的方向

JWURLConnection在-start方法中自己启动自己的线程:

-(void)启动{dispatch_async(dispatch_get_global_queue(dispatch_queue_PRIORITY_DEFAULT,0),^{[super start];}}

您需要确保将在
nsrunlop
NSOperationQueue
上调度
NSURLConnection
的委托方法。虽然
start
方法实际上可以解决这个问题-给定的代码和您的注释表明它没有;)简言之,
dispatch\u async
不保证参考底图线程具有运行循环,调度队列甚至不保证参考底图线程始终相同

这些文档显示了如何安排连接

我建议在主线程上安排连接,并在需要时将其更改为
NSOperationQueue

您的
loginWithUsername:andPassword:
方法将在调用/调用异步函数/方法后立即返回

采用异步模式有点“传染性”。一旦您开始使用异步编程风格,您就无法“摆脱”它,除非您使用阻止当前线程的同步原语。我建议保持异步样式:

- (void) loginWithUsername:(NSString *)uName 
               andPassword:(NSString *)pWord 
                completion:(void(^)(id result))onCompletion;
后来:

[self loginWithUsername:@"Me" andPassword:@"secret" completion:^(id result) {
    if ([result != [isKindOfError class]]) {
        [self fetchImagesWithURL:url completion: ^(id result) {
             ...    
        }];
    }
}];

我知道。。。关于这个或熟悉的话题,不仅问题和讨论很少。但他们的解决方案都不适合我。
[self loginWithUsername:@"Me" andPassword:@"secret" completion:^(id result) {
    if ([result != [isKindOfError class]]) {
        [self fetchImagesWithURL:url completion: ^(id result) {
             ...    
        }];
    }
}];