Рефакторинг моего кода для асинхронного NSURLConnection - PullRequest
0 голосов
/ 05 января 2012

Есть проблемы с использованием синхронных запросов. Проблема заключается в том, что я не совсем уверен, как реорганизовать приведенный ниже код, чтобы использовать асинхронный запрос для выполнения следующих двух задач:

  1. Используйте подпункт UIActivityIndicatorView для уведомления об активной загрузке;
  2. Выполните проверку Reachability перед запросом подключения, чтобы убедиться, что есть подключение к Интернету и что хост доступен, т. Е. reachabilityWithHostName:@"wwww.mywebhostingisterrible.com".

В настоящее время у меня есть класс Fetcher с синглтоном +(Fetcher *)sharedFetcher, который используется во всех моих контроллерах представления для получения данных. В настоящее время все данные выбираются с использованием следующего кода:

- (NSString *)stringWithUrl:(NSURL *)url {

    NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30];

    NSData *urlData;
    NSURLResponse *response;
    NSError *error;

    urlData = [NSURLConnection sendSynchronousRequest:urlRequest
                                    returningResponse:&response
                                                error:&error];

    return [[NSString alloc] initWithData:urlData encoding:NSUTF8StringEncoding];

}

Метод, который выбирает, выглядит следующим образом:

-(NSArray *)fetchDogFoodListing {
    NSString *urlString = [NSString stringWithFormat:@"%@query/dogFood/%@/%lli/%@/%@",self.connectionUrl,self.queryCriteria.dogFoodName,self.queryCriteria.dogFoodBrandId,self.queryCriteria.dogFoodIngredients,self.queryCriteria.dogFoodBrand];
    NSString *json = [self stringWithUrl:[NSURL URLWithString:urlString]];
    return [self.factory buildIKDogFoodArrayWithJSON:json];
}

и звонок с UIViewController в -(void)viewDidLoad выглядит так:

self.dogFoods = [[IKFetcher sharedFetcher] fetchDogFoodListing];

Я думал о внедрении делегата в этой ситуации, но я очень шаток от того, как делегирование должно работать. Я даже не уверен, куда это пойдет. Должен ли Fetcher иметь FetcherDelegate, который может уведомить контроллер представления о том, когда это будет сделано, чтобы пользовательский интерфейс мог обновляться? Должен ли контроллер представления иметь делегата, чтобы сборщик мог обновить представление, когда все готово?

Я уверен, что на основании моих вопросов вы можете увидеть мою неопытность с делегированием, поэтому я был бы признателен за любую помощь.

Ответы [ 2 ]

1 голос
/ 05 января 2012

Вы можете сделать что-то вроде этого

dispatch_async(queue, ^{
    NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30];

    NSData *urlData;
    NSURLResponse *response;
    NSError *error;

    urlData = [NSURLConnection sendSynchronousRequest:urlRequest
                                returningResponse:&response
                                            error:&error];
    dispatch_async(dispatch_get_main_queue(), ^{
         //.. do stuff with data here...
    }
}

или вы можете просто сделать код sendSynchronousRequest внутри dispatch_sync, если вы хотите, чтобы соединение было синхронным, хотя вы действительно должны быть максимально асинхронными.1004 *

1 голос
/ 05 января 2012

Вы можете посмотреть на блестящие рамки Мугунты Кумар:

http://blog.mugunthkumar.com/products/ios-framework-introducing-mknetworkkit

Я планирую использовать это для NSURLConnection в моих будущих проектах

...