per espandere/aggiornamento @ risposta di Kasik. È possibile creare una categoria a AFNetworking in questo modo utilizzando semafori:
@implementation AFHTTPSessionManager (AFNetworking)
- (id)sendSynchronousRequestWithBaseURLAsString:(NSString * _Nonnull)baseURL pathToData:(NSString * _Nonnull)path parameters:(NSDictionary * _Nullable)params {
__block id result = nil;
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
AFHTTPSessionManager *session = [[AFHTTPSessionManager alloc]initWithBaseURL:[NSURL URLWithString:baseURL]];
[session GET:path parameters:params progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
result = responseObject;
dispatch_semaphore_signal(semaphore);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
return result;
}
@end
Se si chiama il blocco di sincronizzazione all'interno di un blocco di completamento di un'altra richiesta di AFNetwork, assicurarsi che si modifica la proprietà completionQueue
. Se non lo si modifica, il blocco sincrono chiamerà la coda principale al completamento mentre si trova già nella coda principale e si bloccherà l'applicazione.
+ (void)someRequest:(void (^)(id response))completion {
AFHTTPSessionManager *session = [[AFHTTPSessionManager alloc]initWithBaseURL:[NSURL URLWithString:@""] sessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
dispatch_queue_t queue = dispatch_queue_create("name", 0);
session.completionQueue = queue;
[session GET:@"path/to/resource" parameters:nil progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
NSDictionary *data = [session sendSynchronousRequestWithBaseURLAsString:@"" pathToData:@"" parameters:nil ];
dispatch_async(dispatch_get_main_queue(), ^{
completion (myDict);
});
} failure:^(NSURLSessionDataTask *task, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
completion (error);
});
}];
fonte
2016-03-15 20:36:09
Hey matt, grazie per la risposta. Di solito uso i miei dati in modo asincrono, ma specificamente per questo devo restituire alcuni dati da un'API, quindi non vedo davvero un altro modo, a meno che tu non possa raccomandare qualche modo di agire? :) –
È sempre possibile aggiungere un parametro di blocco al metodo, ad esempio '-someFunctionWithBlock:^(NSData * data) {...}'. – mattt
Come ho detto che sono piuttosto un principiante con blocchi, come sarà questo aiuto? (e, cosa più importante, che cosa significa avere un parametro di blocco nel metodo?) –