2015-03-04 4 views
-1

Я загружаю наклейку с сайта Parse.com, а затем загружаю изображение для него. По какой-то причине он не добавит моего словаря. Объект создается отлично, но он просто не добавляется. код ниже:Невозможно добавить объект в NSMutableDictionary в блоке анализа

- (void)getNewStickersWithCompletionHandler:(stickerCompletionHandler)handler 
{ 


    __weak StickerManager *weakSelf = self; 
    PFQuery *stickersQuery = [PFQuery queryWithClassName:@"sticker"]; 
    NSNumber *total =[NSNumber numberWithInt:(int)[self.stickerDictionary count]]; 
    //im not sure this is a great way to add what if we miss one..there will be an error 
    [stickersQuery whereKey:@"stickerNO" greaterThan:total]; 
    [stickersQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 

     if(!error) { 



      for(PFObject *object in objects) { 

       NSString *title = object[@"title"]; 
       int stickerNO = [[object objectForKey:@"stickerNO"] intValue]; 


       //DOWNLOAD IMAGE CODE 
       PFFile *image = object[@"image"]; 
       [image getDataInBackgroundWithBlock:^(NSData *data, NSError *error) { 

        if(!error){ 

         UIImage *image = [UIImage imageWithData:data]; 
         Sticker *sticker = [[Sticker alloc] initWithTitle:title stickerNO:stickerNO image:image]; 
         NSLog(@"%@",sticker.title); 
         //sticker has been created! but won’t add! 
         [weakSelf.stickerDictionary setObject:sticker forKey:sticker.title]; 
        } 

       }];//end get image block 




      }//end for 



      handler(YES,nil); 


     } 
    }];//end download stickers block 


} 

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

+0

Одна вещь, которую я проверю, - это создать экземпляр 'stickerDictionary' (ленивое создание экземпляра или в каком-то другом init). Причина в методах вызова object-c на nil может быть трудно обнаружить. Можете ли вы вставить код для создания словаря? – Taha

+0

Вы уверены, что слабый Self! = Nil? Если это не так, вы уверены, что stickerDictionary! = Nil? –

+0

Словарь инициализирован да – Kex

ответ

1

Я подозреваю, ваш вопрос из этой линии:

handler(YES,nil); 

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

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

Примечание

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

+0

whoah! да, это исправить. Я переместил его во внутренний блок. Проблема в том, что я только хочу, чтобы обработчик вызова (ДА, ноль) один раз, когда все изображения загружены ... не будет ли это называть его несколько раз, если у меня есть загрузка двух изображений? – Kex

+0

@Kex да, это будет, поэтому вам нужно будет отслеживать список и иметь огонь внутреннего блока при загрузке последнего изображения. Имейте в виду, что они могут прийти в разное время, поэтому его не просто огонь в последнем внутреннем блоке, а скорее огонь, когда все они вернули либо успех, либо ошибку. Поэтому увеличьте счетчик в каждом внутреннем блоке, затем во внутреннем блоке проверьте, достиг ли счет количества изображений, которые вы ожидали, –

+0

получил его, спасибо за это! – Kex

Смежные вопросы