2012-10-01 78 views
0

我有一個方法發出請求並有一個代表響應者。該方法由KVO響應者調用。當我從viewDidLoad調用它時,代碼工作正常,但是當我從KVO方法發出請求時,它不會觸發委託方法。iOS代理問題與KVO

這裏是我的志願響應:

//observe app delegates userdata to check for when user data is available or data is changed 
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
         change:(NSDictionary *)change 
         context:(void *)context 
{ 
    if ([keyPath isEqualToString:@"userData"]) 
    { 
     //goto facebook logic 
     [self FBFriendSuggester]; 
    } 
} 

並調用方法:

-(void)FBFriendSuggester 
{ 
    NSDictionary * fb_credentials = nil; 
    if([prefs objectForKey:@"facebookCredentials"]) 
    { 
     fb_credentials = [prefs objectForKey:@"facebookCredentials"]; 
     if ([fb_credentials objectForKey:@"expiry"] && [fb_credentials objectForKey:@"fbtoken"]) { 
      NSLog(@"found stored Facebook credentials."); 
      ApplicationDelegate.facebook.accessToken = [fb_credentials objectForKey:@"fbtoken"]; 
      ApplicationDelegate.facebook.expirationDate = [fb_credentials objectForKey:@"expiry"]; 
     } 
    } 
    if ([ApplicationDelegate.facebook isSessionValid]) { 
     printf("_valid facebook\n"); 
     [ApplicationDelegate.facebook requestWithGraphPath:@"me/friends" andDelegate:self]; 
    }else 
     printf("_invalid facebook\n"); 
} 

和委託方法:

- (void)request:(FBRequest *)request didLoad:(id)result{ 
    NSLog(@"result2:%@",result); 

    NSDictionary * rawObject = result; 
    NSArray * dataArray = [rawObject objectForKey:@"data"]; 

    for (NSDictionary * f in dataArray) { 
     [friends addObject:[[KNSelectorItem alloc] initWithDisplayValue:[f objectForKey:@"name"] 
                  selectValue:[f objectForKey:@"id"] 
                   imageUrl:[NSString stringWithFormat:@"http://graph.facebook.com/%@/picture?type=square", [f objectForKey:@"id"]]]]; 
    } 
    [friends sortUsingSelector:@selector(compareByDisplayValue:)]; 
    [self pickerPopup:self]; 
} 

委託方法不會被調用在這種情況下,但它確實工作正常時,我直接從控制器調用 - (void)FBFriendSuggester。我不知道該怎麼做,我試着設置一個通知來回應,希望它能觸發代表,但那也不起作用。

回答

0

我可以通過發行來解決我的問題:

[self performSelectorOnMainThread:@selector(FBFriendSuggester) withObject:nil waitUntilDone:NO]; 

這將是巨大的,知道爲什麼是這樣的,雖然。

1

我知道這是比較舊的,而是給了這種情況的發生原因,韓國國際志願者組織的通知是在發生變化的線程上發送。因此,如果後臺線程更改AppDelegate的屬性,通知更改也會在後臺線程上發生。

所以,在你的代碼的情況下,你的-(void)FBFriendSuggester是最有可能獲取調用在後臺線程。您可以通過在代碼中拋出一個斷點並查看Debug Navigator來確認這一點。

我將繼續與假設這是真的(它在後臺線程中運行)。

這個調用,[ApplicationDelegate.facebook requestWithGraphPath:@"me/friends" andDelegate:self];最有可能需要在主線程上發生。原因可能是底層通話使用NSURLConnection進行通話。連接是在後臺線程上進行的,但是所有委託調用務必返回到主線程而不是後臺線程。通過調用andDelegate:self,它將對象註冊爲後臺線程中的代理,而不是主線程。

這就是爲什麼當前解決方案解決了問題。

快樂編碼!