[英]iOS4 Implementation of -[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]?
[英]NSURLConnection sendAsynchronousRequest:queue:completionHandler not working in iOS 4.3
我在我的应用程序中使用[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
。 通过使用此应用程序,我的应用程序在iOS 4.3中终止,但在iOS 5.0中运行正常。
如何在iOS 4.3中使用此功能可以帮助我。
这是一个对我有用的完整实现。 随意重命名它并添加为NSURLConnection
上的类别,或者只是将其添加为您正在使用的类中的本地方法。
-(void)sendAsynchronousRequest:(NSURLRequest*)request queue:(NSOperationQueue*)queue completionHandler:(void(^)(NSURLResponse *response, NSData *data, NSError *error))handler
{
__block NSURLResponse *response = nil;
__block NSError *error = nil;
__block NSData *data = nil;
// Wrap up synchronous request within a block operation
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
data = [NSURLConnection sendSynchronousRequest:request
returningResponse:&response
error:&error];
}];
// Set completion block
// EDIT: Set completion block, perform on main thread for safety
blockOperation.completionBlock = ^{
// Perform completion on main queue
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
handler(response, data, error);
}];
};
// (or execute completion block on background thread)
// blockOperation.completionBlock = ^{ handler(response, data, error); };
// Execute operation
[queue addOperation:blockOperation];
}
编辑我不得不修改该方法,因为我在完成块中进行了UIKit调用(例如,更新标签等)。 因此,在主线程上调用完成块实际上更安全一些。 (原始版本已注释掉)
您尝试使用的方法仅在iOS 5上可用。对于较早的操作系统,请考虑使用
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error
并将其包装到新线程中以实现异步行为。
H2CO3和Ken Thomases的建议都是正确的。
此外,您还可以查看ios4的nsurlconnection-sendasynchronousrequestqueuecompletio的实现 。
如果将主队列用作完成处理程序执行的队列,则可以使用(如Tom所建议的)委托模式。 为了避免重复代码,可以在NSURLConnection
委托机制上使用包装器。
在另一种情况下,如果您想要维持异步行为并且不想处理同步调用(如H2CO3所建议的那样,请注意他的建议也是有效的),并且完成处理程序在另一个队列中执行,那么我建议您可以将异步委托模式包装在NSOperation
类中。 这种方法非常困难,但是您可以在《 并发的神秘行动》中找到一个很好的方法(请参阅这两篇文章)。
希望能帮助到你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.