我正在为我的 iPad 应用程序创建一个 REST 客户端类。所以我创建了一个BOOL
使用我之前创建的 NSURLConnection 子类进行登录的方法。
此 JWURLConnection 具有用于 finishLoading 和 failWithError 操作的块类型属性。
问题是 URL 连接很可能在此方法完全执行后完成(或失败)。A 也不能使用额外的方法来使用performSelector:waitUntilDone:
,因为我必须等待连接。
现在我尝试使用普通的 C 信号量和一个额外的线程(这样信号量只阻塞 RESTClient 线程,而不是 URLConnections 线程),但我没有成功;该方法开始等待,但整个连接的东西都被冻结了,因此没有来自连接的 NSLogs。
JWURLConnection 在-start
方法中自行启动它自己的线程:
- (void)start { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [super start]; }); }
这是我尝试过的代码(使用信号量):
- (BOOL)loginWithUsername:(NSString *)uName ansPassword:(NSString *)pWord {
__block BOOL loginSucceeded = NO;
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
JWURLConnection *connection = [JWURLConnection connectionWithPOSTRequestToURL:POSTData:];
[connection setFinished^(NSData *data) {
// validate server response and set login variable
loginSucceeded = YES;
dispatch_semaphore_signal(sema);
}];
[connection setFailed:^(NSError *error) {
loginSucceeded = NO;
NSLog(@"Login failed: %@", [error description]);
dispatch_semaphore_signal(sema);
}];
[connection start];
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
// do some more stuff like error handling / reporting here
return loginSucceeded;
}
我希望你能引导我正确的方向......