NSURLConnection sendAsynchronousRequest:queue:completionHandler在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 

并将其包装到新线程中以实现异步行为。

H2CO3Ken Thomases的建议都是正确的。

另外,您可以查看ios4-implementation-of-nsurlconnection-sendasynchronousrequestqueuecompletio 。

如果您将主队列用作完成处理程序执行的队列,则可以使用(如Tom所建议的)委托模式。 为避免重复代码,您可以在NSURLConnection委托机制上使用包装器。

在另一种情况下,如果你想维持异步行为并且你不想处理同步调用(如H2CO3建议,请注意他的建议也是有效的)并且完成处理程序在不同的队列中执行,那么我建议您要在NSOperation类中包装异步委托模式。 这种方法非常困难,但您可以在Concurrent Operations Demystified中找到一种很好的方法(参见这两篇文章)。

希望能帮助到你。