2013-11-27 53 views
0

我有一个UITextField,它允许用户为Facebook照片输入一个自定义相册名称。一旦textFieldShouldReturn,我把textField.text并发送到Facebook。一旦完成处理程序被调用,我想更新我的模型并重新加载我的tableView中的数据。textFieldShouldReturn - completionHandler中的某些方法永远不会被调用

我的问题是我的completionHandler的一些行从来没有被调用过。我使用调试器标记了所有行,并且一旦逐行执行代码,其中一些行就不会被调用,尤其是不会调用tableView重载方法。

我在做错误的线程?为什么我的completionHandler部分被取消并且从未被调用过?

这里是我的代码:

-(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; 

} 
+0

显然线如果条件不符合,则不执行。 – jlehr

+0

@jlehr这不是问题。 if语句被执行,但只执行了该语句的几行。这个问题最终是我如何初始化NSDictionary。正确的是:NSDictionary * newAlbum = [[NSDictionary alloc] initWithObjectsAndKeys:newAlbumName,@“name”,nil]; –

回答

1

你不应该直接调用自你的块。这可能导致保留周期。 所以块声明之前:

__weak的typeof(个体)weakSelf =自我;

并在您的区块中使用weakSelf而不是自己。

+0

OP的问题与保留周期无关。 – jlehr

+0

谢谢弗兰克。事实证明,这个问题是我如何初始化NSDictionary。这导致了我仍然不太明白的代码的奇怪跳过,但是这固定了它:NSDictionary * newAlbum = [[NSDictionary alloc] initWithObjectsAndKeys:newAlbumName,@“name”,nil]; –

+0

无论如何,我认为你的回答很重要,因为我不应该在块中称自己。 –

1

我相信这是线程问题。我从未与FBRequestConnection类的工作,但如果它的块在后台线程执行,你需要在主线程像这样上更新用户界面:在你的`if`语句体赢得了代码

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]; 
    }); 
} 
+0

感谢您的回答。我没有考虑过,如果在后台线程上执行,它可能会时钟。然而,最后问题是我如何初始化NSDictionary。正确的方法是:NSDictionary * newAlbum = [[NSDictionary alloc] initWithObjectsAndKeys:newAlbumName,@“name”,nil]; –

相关问题