2013-10-15 33 views
0

嘗試發送以下信息API塊信息錯誤

- (NSArray *)callSwaggerwithStart:(NSNumber *)start andCount:(NSNumber *)count 
{ 
    [api messageWithCompletionBlock:start count:count filter:@"image" completionHandler:^(CustomResponse *output, NSError *error) { 
     if (!error) { 
      return [NSArray arrayWithArray:[[output toDictionary] valueForKey:@"items"]]; 
     } else { 
      NSLog(@"ERROR IN CallApi, %@", &error); 
     } 
    }]; 
    return nil; 
}

我收到以下錯誤:

Incompatible block pointer types

Control may reach end of non-void block

塊是從API類,和我想要創建一個方法,因爲它在一個控制器中被多次使用。什麼使代碼不能夠返回嵌套的NSArray值?

+1

爲什麼'callSwaggerwithStart ...'方法有返回值?當處理一個異步塊時,在方法返回很長時間之後纔會返回數據是毫無意義的。你需要重新思考它是如何工作的。 – rmaddy

+0

我已經添加了返回值,然後將其刪除。謝謝! – aug2uag

回答

1

API完成塊是異步執行的,所以你不能同步返回計算給callSwaggerWithStart...調用者的任何東西。 completionHandler很可能比方法返回的時間晚得多。

一個有效的辦法是也使callSwaggerWithStart...異步的,如下:

- (void)callSwaggerwithStart:(NSNumber *)start andCount:(NSNumber *)count completionHandler:(void (^)(NSArray *result, NSError *error))completionHandler 
{ 
    [api messageWithCompletionBlock:start count:count filter:@"image" completionHandler:^(CustomResponse *output, NSError *error) { 
     if (completionHandler) { 
      if (!error) { 
       completionHandler([output toDictionary][@"items"]], error); 
      } else { 
       completionHandler(nil, error); 
      } 
     } 
    }]; 
} 
+1

+1真棒@GP,很高興看到這種模式來處理塊的塊 – aug2uag

1

-messageWithCompletionBlock:etc:方法似乎是異步的,這意味着,就像它當前寫入的那樣,將在-callSwaggerEtc:返回後調用該塊。塊中的「返回」從塊中返回,而不是從方法本身返回您有兩個選項 - 更改-callSwaggerEtc:以獲取其自己的完成處理程序,或使用semaphore使其同步並等待返回,直到塊被調用。

+0

Ooph,返回的錯誤 – aug2uag

0

startNSNumber,而不是一個塊。或者messageWithCompletionBlock:真是名不符實...

completionHandler不期望有回報。這也是一個塊,所以從那裏返回只是退出塊,而不是包含的方法。

你的方法期望返回一個數組,你希望能夠在塊內完成 - 你錯了。你需要改變你的設計,所以這個方法不會返回一個數組(也許它會調用它作爲參數傳遞的塊),或者它以不同的方式獲取數組。

+0

我強烈懷疑它的命名很糟糕。 –