документ dataTaskWithURL, что означает значение ошибки {NSURLErrorDomain, NSURLErrorCancelled}?

Допустим, вы используете NSURLSession dataTaskWithURL:...

self.currentConnection =
  [sess dataTaskWithURL:goUrl
  completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
    {
    [self.results addObjectsFromArray: [self yourDataConversionCode:data] ];

    dispatch_async(dispatch_get_main_queue(), ^{  if (after) after(); );
    }];

конечно, если может потребоваться отменить его. (Скажем, пользователь изменил условие поиска или похожая проблема.) Это легко сделать с...

-(void)cancelAnyCurrentBooksearch
  {
  [self.currentConnection cancel];
  self.currentConnection = nil;
  }

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

Теперь вот «документация» для отмены:

/* -cancel returns immediately, but marks a task as being canceled.
 * The task will signal -URLSession:task:didCompleteWithError: with an
 * error value of { NSURLErrorDomain, NSURLErrorCancelled }.
 */
- (void)cancel;

Вот проблема...

Что, черт возьми, это значит:

значение ошибки { NSURLErrorDomain, NSURLErrorCancelled

Можете ли вы иметь ДВА значения в NSError ??

Если да, то как мне проверить, что ошибка NSError была точно такой:

" { NSURLErrorDomain, NSURLErrorCancelled } "

что бы это ни значило?

Обратите внимание, что если вы сделаете это:

self.currentConnection =
  [sess dataTaskWithURL:goUrl
  completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
    {
    if( [error code] == NSURLErrorCancelled )
      {
      NSLog(@"  seemed to be CANCELLED programmatically?");
      return;
      }

    [self.results addObjectsFromArray: [self yourDataConversionCode:data] ];

    dispatch_async(dispatch_get_main_queue(), ^{  if (after) after(); );
    }];

Это "кажется, работает" - но, конечно, это трудно понять.

Вот как это проверить??

 * The task will signal -URLSession:task:didCompleteWithError: with an
 * error value of { NSURLErrorDomain, NSURLErrorCancelled }.

Что означает «две ошибки в фигурных скобках» в документации?

Означает ли это, что может произойти любое из этих событий?

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


person Fattie    schedule 01.08.2014    source источник
comment
Тот, кто проголосовал против этого, невероятно глуп. Голосование против на этом сайте просто становится смешным. Доходит до того, что, если вопрос носит технический характер, люди просто голосуют против него, потому что не умеют правильно читать и не понимают его. Это действительно абсурд!   -  person Fattie    schedule 01.08.2014
comment
Проголосовал за, потому что люди, которые голосуют против без уважительной причины, меня раздражают, вероятно, им не понравился ваш красочный язык.   -  person Ryan Heitner    schedule 28.12.2014
comment
ХЕ спасибо Райан - счастливого нового года :)   -  person Fattie    schedule 02.01.2015


Ответы (1)


Значение ошибки { NSURLErrorDomain, NSURLErrorCancelled }

Можете ли вы иметь ДВА значения в NSError ??

Да. Это объект. Он имеет свойства. Если вы проверите документацию, вы обнаружите, что у него есть свойства domain и code.

Если бы вы хотели проверить оба, вы бы сделали это, как и следовало ожидать:

if ([error.domain isEqualToString:NSURLErrorDomain] && 
    error.code == NSURLErrorCancelled)

См. Руководство по обработке ошибок. полные сведения об обработке ошибок, включая домены и коды.

Сказав это, я думаю, что маловероятно, что что-либо отличное, кроме NSURLErrorDomain, будет связано с обработчиком завершения задачи данных NSURLSession с кодом NSURLErrorCancelled, поэтому вы должны быть в порядке, просто проверив это, как вы .

person Matt Gibson    schedule 01.08.2014
comment
Ах! Блестяще, Мэтт! Мне просто не приходило в голову, что это домен. Что с их причудливым синтаксисом { }? (У него есть три свойства - это должен быть синтаксис псевдоструктуры или что-то в этом роде?!) Еще раз спасибо!!! - person Fattie; 01.08.2014
comment
Дерьмо -- Мэтт, ты понял, что .domain - это NSString !! Я не знал этого до сих пор. - person Fattie; 03.08.2014
comment
Поскольку error.domain является строкой NSString, мы должны вместо этого использовать if ([error.domain isEqualToString:NSURLErrorDomain] && error.code == NSURLErrorCancelled). - person huntert; 25.02.2015
comment
@huntert Хороший вопрос! Я явно слишком много делал на Swift, когда отвечал на этот вопрос. Исправлена. - person Matt Gibson; 25.02.2015
comment
Есть ли возможность получить этот код ошибки «NSURLErrorCancelled», кроме того, что мы отменяем задачу с помощью «[отмена задачи];» ? - person Vineeth; 03.03.2016