textFieldShouldReturn — некоторые методы в completeHandler никогда не вызываются

У меня есть UITextField, который позволяет пользователю вводить собственное имя альбома для фотографий Facebook. Как только textFieldShouldReturn, я беру textField.text и отправляю его в Facebook. После вызова обработчика завершения я хотел бы обновить свою модель и перезагрузить данные в моем tableView.

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

Я делаю что-то неправильное? Почему мой completeHandler частично отменен и никогда не вызывается?

Вот мой код:

-(BOOL)textFieldShouldReturn:(UITextField *)textField {

NSString *newAlbumName;
newAlbumName = textField.text;

NSMutableDictionary* parameters = [NSMutableDictionary dictionary];
[parameters setObject:newAlbumName forKey:@"name"];
[parameters setObject:newAlbumName forKey:@"message"];

FBRequest* request = [FBRequest requestWithGraphPath:@"me/albums" parameters:parameters HTTPMethod:@"POST"];

FBRequestConnection *connection = [[FBRequestConnection alloc] init];
[connection addRequest:request
     completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
         if (!error) {
             NSDictionary *newAlbum;
             [newAlbum setValue:newAlbumName forKey:@"name"];
             [self.albums addObject:newAlbum];
             NSLog(@"created: %@", [newAlbum objectForKey:@"name"]);
             [self.tableView reloadData];
         }
         else {
             NSLog(@"Error: %@", error.userInfo);
         }


     }];
[connection start];

[textField resignFirstResponder];
[textField removeFromSuperview];



   return YES;

}

person n.evermind    schedule 27.11.2013    source источник
comment
Очевидно, что строки кода в теле вашего оператора if не будут выполнены, если условие не будет выполнено.   -  person jlehr    schedule 28.11.2013
comment
@jlehr Это не проблема. оператор if был выполнен, но были выполнены только несколько строк этого оператора. Проблема, в конце концов, заключалась в том, как я инициализировал NSDictionary. Правильно было бы: NSDictionary *newAlbum = [[NSDictionary alloc] initWithObjectsAndKeys:newAlbumName, @name, nil];   -  person n.evermind    schedule 28.11.2013


Ответы (2)


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

__weak typeof(self) weakSelf = self;

И используйте weakSelf в своем блоке вместо себя.

person Franck    schedule 27.11.2013
comment
Вопрос ОП не связан с сохранением циклов. - person jlehr; 28.11.2013
comment
Спасибо, Франк. Оказалось, что проблема заключалась в том, как я инициализировал NSDictionary. Это приводило к странному пропуску кода, который я до сих пор не совсем понял, но это исправило ситуацию: NSDictionary *newAlbum = [[NSDictionary alloc] initWithObjectsAndKeys:newAlbumName, @name, nil]; - person n.evermind; 28.11.2013
comment
В любом случае, я думаю, что ваш ответ важен, так как я не должен называть себя в блоке. - person n.evermind; 28.11.2013
comment
здорово, что вы нашли решение! Спасибо - person Franck; 28.11.2013

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

if (!error) {
    NSDictionary *newAlbum;
    [newAlbum setValue:newAlbumName forKey:@"name"];
    [self.albums addObject:newAlbum];
    NSLog(@"created: %@", [newAlbum objectForKey:@"name"]);
    dispatch_async(dispatch_get_main_queue(),^{
        [self.tableView reloadData];
    });
}
person Guferos    schedule 27.11.2013
comment
Спасибо за Ваш ответ. Я не учел, что это может синхронизироваться, если выполняется в фоновом потоке. Однако в конце концов проблема заключалась в том, как я инициализировал NSDictionary. Правильно было бы: NSDictionary *newAlbum = [[NSDictionary alloc] initWithObjectsAndKeys:newAlbumName, @name, nil]; - person n.evermind; 28.11.2013