2013-11-27 54 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]; –

相關問題