nsurlconnection асинхронный запрос - PullRequest
7 голосов
/ 15 февраля 2012

Во-первых, вопросы просто неудачны ... если вы просто хотите увидеть, что они пропустили, перейдите к нижней части этого поста и вы увидите их жирным шрифтом ... для получения более подробной информации вы можете прочитать остальную часть этого поста. ...

Я просто пытаюсь сгладить соединение NSURLC, чтобы оно работало гладко, и я правильно понимаю. Существует глубокое отсутствие примеров / учебных пособий по асинхронным соединениям в Интернете или нет, которые я могу найти, которые объясняют, что происходит с любым уровнем глубины, кроме как наладить и запустить соединение, которое после работы над ним кажется довольно простым. Надеюсь, этот вопрос может заполнить пустоту, которая, как мне кажется, существует для других пользователей.

Итак, в моем .h файле я импортировал заголовки фондов и объявил методы, необходимые для получения или отсутствия полученных данных (ошибки и т. Д.).

.h

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h> //add foundations
//.. other headers can be imported here

@interface MyViewController: UITableViewController { 

//Im not setting any delegates to access the methods because Is all happening in the same 
//place so I just use the key word 'self' when accessing the methods declared below
//I'm not sure if this is the best thing to do but I wasn't able to get my head around declaring the delegate or how it would help me with the way I have set up my request etc.

}
- (IBAction)setRequestString:(NSString *)string; //this method sets the request and connection methods

//these methods receive the response from my async nsurlconnection
- (void)receivedData:(NSData *)data;
- (void)emptyReply;
- (void)timedOut;
- (void)downloadError:(NSError *)error;

Так вот мой заголовочный файл ... довольно просто, не нужно много объяснений.

.m

//call setRequestString from some other method attached to a button click or something
[self setRequestString:@"rss.xml"];
//..

- (IBAction)setRequestString:(NSString *)string
{
    //Set database address
    NSMutableString *databaseURL = [[NSMutableString alloc] initWithString:@"http:www.comicbookresources/feeds/"]; // address not real jsut example

    //append the string coming in to the end of the databaseURL
    [databaseURL appendString:string];

    //prepare NSURL with newly created string
    NSURL *url = [NSURL URLWithString:databaseURL];

    //AsynchronousRequest to grab the data
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
    {
        if ([data length] > 0 && error == nil){
            [self receivedData:data];
        }else if ([data length] == 0 && error == nil){
            [self emptyReply];
        }else if (error != nil && error.code == NSURLErrorTimedOut){ //used this NSURLErrorTimedOut from foundation error responses
            [self timedOut];
        }else if (error != nil){
            [self downloadError:error];
        }
    }];
}

теперь настраивает методы, которые были инициализированы в файле .h и вызваны в операторе if выше

- (void)receivedData:(NSData *)data
{
    NSString* newStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@", newStr);   //logs recived data
    //now you can see what data is coming in on your log
    //do what you want with your data here (i.e. start parsing methods
}
- (void)emptyReply
{
    //not sure what to do here yet?
}
- (void)timedOut
{
    //also not sure what to do here yet?
}
- (void)downloadError:(NSError *)error
{
    NSLog(@"%@", error);
    UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:@"Error!" message:@"A connection failure occurred." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    [errorAlert show];
}

Круто, так что в основном основы того, что я сделал прямо сейчас ... теперь у меня есть следующие вопросы.

Вопрос первый: Где я называю NSURLConnection, вот так

[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
        {

Что здесь происходит, для чего ^ то, что весь этот блок (включая операторы if) выполняется в другом потоке или что-то еще? потому что это выглядит как грандиозное централизованное форматирование, но немного отличается.

Вопрос второй: что я должен делать внутри emptyReply & timedOut методов?

Вопрос третий: Как бы я включил кэширование в это? Я хотел бы кэшировать ответы, которые я получаю от разных запросов. то есть с моим setRequestString вы увидите, что есть строковый входной параметр, поэтому я могу запрашивать разные RSS-каналы одним и тем же методом. Мне нужно выяснить, как кэшировать эти ответы в отдельные кэши ... но я не уверен, с чего начать это.

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

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

1 Ответ

5 голосов
/ 15 февраля 2012
  1. Читайте о блоках в документации Apple.Это новое.Или вы можете прочитать здесь
  2. Вы можете показать ошибки, такие как тайм-аут запроса и т. Д. Вам не нужно обрабатывать их отдельно от ошибки, если у вас нет специальной логики.
  3. Попробуйте это для кеширования

    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:TIMEOUT_INTERVAL];
    
...