2013-07-17 53 views
2

這是AFNetworking的示例代碼片段:需要解釋這種用法塊作爲方法的參數

+ (void)globalTimelinePostsWithBlock:(void (^)(NSArray *posts, NSError *error))block { 
    [[AFAppDotNetAPIClient sharedClient] getPath:@"stream/0/posts/stream/global" parameters:nil success:^(AFHTTPRequestOperation *operation, id JSON) { 
     NSArray *postsFromResponse = [JSON valueForKeyPath:@"data"]; 
     NSMutableArray *mutablePosts = [NSMutableArray arrayWithCapacity:[postsFromResponse count]]; 
     for (NSDictionary *attributes in postsFromResponse) { 
      Post *post = [[Post alloc] initWithAttributes:attributes]; 
      [mutablePosts addObject:post]; 
     } 

     if (block) { 
      block([NSArray arrayWithArray:mutablePosts], nil); 
     } 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     if (block) { 
      block([NSArray array], error); 
     } 
    }]; 
} 

什麼我不明白是:

  1. (void (^)(NSArray *posts, NSError *error))block部分。假設它是一個塊,是否意味着該塊是globalTimelinePostsWithBlock方法的參數?

  2. 在第一個問題之後,任何人都可以解釋我的語法嗎?爲什麼最後有block關鍵字?

回答

2

,如果你不知道如何塊工作..然後不要試圖通過查看代碼來理解它(即使您已經使用其他語言(如JavaScript或Ruby)中的lambda /匿名函數)。b/c objective-c語法是一個類自己..

我建議你花點時間在obj-c上理解塊語法,然後看看使用它們的例子。這tutorial是優秀的(兩個部分)..

我沒有你之前..做了什麼,拿出一半我的頭髮..看說教程後..我的頭髮長得就回來了:)


只是爲了好玩,我會盡量滿足您的具體問題:

1.(無效(^)(NSArray的*帖子,NSError *錯誤))塊的一部分。假設它是一個塊,是否意味着該塊是globalTimelinePostsWithBlock方法的參數?

是的,它是..所以這是調用此方法的一種方式:

// first define the block variable 
void(^block)(NSArray *posts, NSError *error) = (NSArray *posts,NSError *error) { 

    // block body 
    // posts and error would have been passed to this block by the method calling the block. 
    // so if you look at the code sample below.. 
    // posts would be [NSArray arrayWithArray:mutablePosts] 
    // and error would just be nil 
} 

// call the function 
[AFNetworking globalTimelinePostsWithBlock:block];  

2.繼第一個問題,任何人都可以解釋的語法給我嗎?爲什麼最後有一個block關鍵字?

基本塊關鍵字參數的名稱..注意它是如何在方法體中使用:

if (block) { 
      block([NSArray arrayWithArray:mutablePosts], nil); 
     } 

再次明白如何/爲什麼..我建議你看看上面文章..在obj-c學習塊有一點學習曲線..但一旦你掌握它..這是一個了不起的工具。請在這裏查看我的answer以查看塊的一些示例用途。

Here也是一個示例問題/答案,它提供了將委託轉換爲基於塊的方法的案例研究,該方法也可以說明塊如何工作。

+0

感謝您的回答!所以我想接下來要問的是,如果教程中的示例是:'(int)(^ name)(int)',那麼名稱位於返回類型之後,爲什麼在上面的AFNetworking ,名稱('block')寫在參數後面? – hfz

+1

它們是兩個不同的東西。'(int)(^ name)(int)'是指向一個塊的變量的名稱,而'(void(^)(NSArray * posts,NSError * error))block'是一個參數*類型*,這個參數被稱爲'塊'..它需要一段時間才能沉入...不要急於:) 現在我可以有我的+1嗎? ;) – abbood

+0

@hfz如果你仍然在尋找塊..檢查[這](http://stackoverflow.com/questions/17773067/how-to-add-an-extra-argument-to-a-block)出來了! – abbood

1

當API調用成功時,塊被傳遞到方法中作爲被調用的對象。 globalTimelinePostsWithBlock將調用傳入數據的塊(並可能是NSError

block在這種情況下不是關鍵字,它只是變量的名稱。

如果你想使用globalTimelinePostsWithBlock,你會這樣稱呼它

[ClassName globalTimelinePostsWithBlock:^(NSArray *posts, NSError *error) { 
    // Check error, then do something with posts 
}]; 

(其中ClassNameglobalTimelinePostsWithBlock其上定義的類名)

+2

只是爲了澄清,'block'永遠不是關鍵字。 '__block'是一個關鍵字。 –

1

塊定義類似於C函數。

(void (^)(NSArray *posts, NSError *error))block 
  • 初始void定義函數的返回類型。
  • ^是塊指針。類似於對象的*
  • (NSArray *posts, NSError *error)是具有變量名稱的參數。
  • block是這個塊被存儲的變量。 (這裏的命名錯誤)
+1

感謝您的回答,尤其是'壞名字'這個部分。它最讓我困惑,我很難找到爲什麼它被使用。 – hfz

相關問題