мутация в быстром перечислении? - PullRequest
2 голосов
/ 05 декабря 2011

На самом деле я получаю странное исключение: я повторяю MutableDictionary и хочу установить в нем новое значение:

    selectionIndex = [NSMutableDictionary dictionaryWithDictionary:selection];
    NSString *whatever = @"999999";
    id keys;
    NSEnumerator *keyEnum = [selectionIndex keyEnumerator];

    while (keys = [keyEnum nextObject]) 
    {
        [selectionIndex setObject:whatever forKey:keys];
    }

Кстати, выбор, который передается этому методу, является MutableDictionary.Если я запускаю этот код, я получаю следующее исключение:

2011-12-05 15: 28: 05.993 lovelini [1333: 207] * Завершение работы приложения из-за необработанного исключения «NSGenericException», причина: '* Коллекция <__NSCFDictionary: 0x6a33ed0> была мутирована при перечислении. {type = изменяемый dict, count = 8, records => 0: {contents =

Хорошо, язнаю, что я не могу изменить NSDictionary, но, насколько я вижу, я этого не делаю!Так почему я получаю это исключение?Это ограничение быстрого перечисления ???Насколько я знаю, невозможно добавить или удалить записи в Fast Enumeration, но я ничего не добавляю и не удаляю?!

Ответы [ 5 ]

9 голосов
/ 05 декабря 2011

Вы не можете вносить какие-либо изменения в коллекцию при ее перечислении. Вместо этого вы можете перечислить ключи словаря вместо самого словаря:

for (NSString *key in selectionIndex.allKeys) {
    [selectionIndex setObject:whatever forKey:key];
}
2 голосов
/ 05 декабря 2011

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

1 голос
/ 05 декабря 2011

Быстрое перечисление только для просмотра объектов в коллекции. Вы не можете изменять элементы.

Перечисление «безопасно» - у перечислителя есть защита от мутаций, поэтому, если вы попытаетесь изменить коллекцию во время перечисления, возникнет исключение. AppleDeveloperPortal

0 голосов
/ 06 января 2017

NSURLSessionConfiguration * configuration = [NSURLSessionConfiguration defaultSessionConfiguration];

    NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:nil delegateQueue:nil];


    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/services/userDATE.php?user_id=%@",MAINDOMAINURL,[[NSUserDefaults standardUserDefaults] objectForKey:@"USERID"]]];



    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
                                                           cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                       timeoutInterval:60.0];


    NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        if (error == nil)
        {
            NSMutableDictionary *jsonDict = [[NSMutableDictionary alloc]init];
            jsonDict=[NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

            NSLog(@"DATA:%@",jsonDict);

            NSLog(@"driver tracking ::%@",[jsonDict objectForKey:@"response"]);
            if ([[jsonDict objectForKey:@"avialabity"] isEqualToString:@"yes"]) {


                    isDriverTracking=YES;
                    dispatch_async(dispatch_get_main_queue(), ^{
                        [self hideActivityIndicator];
                        [self performSegueWithIdentifier:@"FIRSTSEGUE" sender:nil];
                    });


            }else{
                dispatch_async(dispatch_get_main_queue(), ^{
                    [self hideActivityIndicator];
                    [self performSegueWithIdentifier:@"SECONDSEGUE" sender:nil];
                });
            }
            [self hideActivityIndicator];

        }else [self customeAlertController:@"Alert !" :@"Plese check Your internet connection."];
    }];
    [postDataTask resume];

I GOT SAME ERROR была изменена при перечислении.

0 голосов
/ 05 декабря 2011

Да, вы добавляете что-то к тому, что перечисляете:

[selectionIndex setObject:

Это не ограничение быстрого перечисления, а вообще перечисление.Быстрое перечисление является более удобным (и на самом деле более быстрым) способом перечисления.(См. это сравнение .)

Итог: не возитесь с содержимым коллекции, пока вы просматриваете ее, у вас будут проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...