2013-11-27 1 views
0

사용자가 Facebook 사진에 대한 사용자 정의 앨범 이름을 입력 할 수있게하는 UITextField가 있습니다. textFieldShouldReturn이 끝나면 textField.text를 가져 와서 Facebook으로 보냅니다. 완성 처리기가 호출되면 내 모델을 업데이트하고 내 tableView에서 데이터를 다시로드하고 싶습니다.textFieldShouldReturn - completionHandler의 일부 메소드는 호출되지 않습니다.

내 문제는 내 completionHandler의 일부 라인이 호출되지 않는다는 것입니다. 디버거를 사용하여 모든 라인을 표시했는데 코드를 한 라인 씩 실행하면이 라인 중 일부는 호출되지 않습니다. 특히 tableView reload 메소드가 아닙니다.

나는 thread-wise를 잘못하고 있습니까? 왜 내 완성품 처리기가 부품을 취소하고 전화 한 적이 없습니까?

-(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 (self) weakSelf = self;

블록 대신 자신의 블록에 weakSelf을 사용하십시오.

+0

OP의 질문은주기 유지와 관련이 없습니다. – jlehr

+0

감사합니다. Franck. 문제는 NSDictionary를 초기화하는 방법이었습니다. 이것은 내가 아직 이해하지 못했던 코드의 이상한 건너 뛰기로 이어지지 만, 이것으로 해결됩니다 : NSDictionary * newAlbum = [[NSDictionary alloc] initWithObjectsAndKeys : newAlbumName, @ "name", nil]; –

+0

어쨌든 나는 블록에서 자기를 부르면 안된다는 대답이 중요하다고 생각합니다. –

1

저는 이것이 스레딩 문제라고 생각합니다. 나는 FBRequestConnection 클래스와 함께 일한 적이 있지만 블록이 백그라운드 스레드에서 실행되는 경우는 다음과 같이 메인 스레드에서 UI를 업데이트해야합니다 : 원 귀하의`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]; –