2013-02-05 40 views
0

在這裏顯示我與Objective C的新手。這兩個方法中的第二個被上面的方法調用。雖然我完全不知道在哪裏?我希望能夠在if語句中包裝調用第二個方法的部分,根據返回的布爾值確定文件是否存在。示例代碼將不勝感激,如果任何人也可以解釋如何調用這第二種方法,這也將是太棒了。Objective C不確定方法被調用的地方?

-(void) queryResponseForURL:(NSURL *)inURL { 
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:inURL]; 
    [request setHTTPMethod:@"HEAD"]; 
    NSURLConnection * connection = [NSURLConnection connectionWithRequest:request delegate:self]; 
    // connection starts automatically 
} 

-(BOOL)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ 
    if([(NSHTTPURLResponse *)response statusCode] == 200){ 
     NSLog(@"file exists"); 
     return YES; 
    }else return NO; 
} 

回答

2

第二種方法是委託或回調方法。當連接實例收到您連接的服務器的響應時,會調用回調方法。 NSURLConnection在NSObject上有一些非正式的協議。這意味着當NSObject的任何子類實現這些方法時,將自動調用在這些協議中定義的方法。你的NSObject的子類已經實現了這些回調方法之一,因此這個方法被調用。大多數代表被宣佈爲正式的協議,並且需要在您的類中明確定義以便使用它們。 NSURLConnection的非正式協議是規則的例外,雖然這將在未來版本的iOS中改變。

P.S .: Objective-C中的協議基本上與Java/C#中的接口相同。

此處瞭解詳情:http://developer.apple.com/library/ios/ipad/#documentation/Foundation/Reference/NSURLConnectionDataDelegate_protocol/Reference/Reference.html


我猜你想,當你收到了錯誤的響應取消連接?你應該做的是以下幾點:

  1. 將你的URLConnection存儲在ivar或財產(我個人更喜歡財產)。
  2. 在您的-connection:didReceiveResponse委託方法中,如果響應狀態碼不是合適的值,請取消您的連接。你可以用你的伊娃或財產來達到這個目的。
+0

非常感謝您的快速回復。所以我假設有一種方法來獲得在上面的方法中返回布爾值的方法? – Adam

+0

是的,您通常會在Google中查找委託方法以查找Apple文檔(例如NSURLConnectionDelegate)。或者您只需檢查NSURLConnection類的頭(在Xcode中鍵入__NSURLConnection__,然後按住SHIFT鍵並單擊命令以單擊該名稱以導航到頭)。 –

2

它被NSURLConnection對象調用,所以你不能介入調用它的代碼。但是你不需要 - 委託方法的目的是讓你能夠連接到那些不可訪問的代碼。

方法簽名是這樣的,順便說一句:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 

它沒有返回值,你不能改變方法簽名,因爲它是NSURLConnection的對象的協議的一部分。請記住,您不會調用此方法,連接對象會這樣做。但你可以迴應該方法。不要試圖返回一個BOOL,你可以在這個方法內處理你的'if file ..'代碼,或者調用另一個方法。你應該記住,當響應被確認已經啓動時,這被觸發(異步),因此你可以檢查HTTP頭信息,如MIME類型 - 但它不保證完成數據傳輸(有other delegate methods for that)。

另請參閱developer guide to NSURLConnection