2010-01-23 50 views
2

想象一下列出一些食譜的表格視圖。用戶每次點擊食譜時,都會加載一個新的表格視圖,列出食譜成分。異步無狀態API

來獲取信息,我打電話異步使用REST API:

NSURLRequest *request = [NSURLRequest requestWithURL:url 
             cachePolicy:NSURLRequestReloadIgnoringLocalCacheData 
             timeoutInterval:30]; 

當用戶點擊一個偏方,對API調用,以獲得配方成分。但是,一旦在新視圖(哪些列表成分)中以及在接收到答案之前,用戶可以返回並選擇新配方。

在這種情況下,我會收回兩個答案;每個請求一個。問題是我不知道這個答案是什麼請求,我會用一個錯誤的答案刷新錯誤的內容。

我不確定在這種情況下哪種方法是正確的。我正考慮在答案中包含每個請求參數。所以,如果我是,例如,使用API​​來搜索特定術語,我們說「富」,我會包括在回答期限過,例如:

請求:

http://domain.com/api/search?term=foo

回答

{ 
"requestType": "search", 
"term": "foo", 
"result" : "a foo result" 
} 

它看起來很奇怪,我包括在每個答案的每個請求參數,但它是我發現CREA唯一的解決辦法一個無狀態API準備被稱爲異步。

¿是否有任何其他方式來完成此?

(我使用委託模式爲接收到答案時調用的每個請求分配一個對象。問題是,在配方示例中,成分表視圖被重用eache time recipe ingredientes are listed )。

回答

2

一種可能性是在請求中包含一個唯一的「請求ID」,並讓服務器迴應它。然後服務器不需要返回所有的請求參數,只需要返回請求標識。客戶端會爲每個請求生成一個新的ID,可能使用像遞增整數一樣簡單的操作。

另一種可能性是創建一個「可取消的異步請求」。發出請求時,返回可用於取消請求的對象。如果請求在委託被解僱之前被取消,那麼確保委託不會被解僱。當一個響應返回一個被取消的請求時,就把它扔掉。對於您的配料表,在發出新的請求之前,您可以取消任何未決的請求(以便一次最多隻有一個未取消的請求)。

實現此目的的一種方法是構建一個兩階段回調。由基礎設施管理的第一個回調只是檢查請求是否被取消。如果沒有,它會繼續調用第二個回調函數(實際上是您的委託)。

0

這裏的一個典型方法是爲每個配方分配一個唯一的值(「關鍵」值),並將其發回給響應,就像您提出的那樣。關鍵值可以是配方名稱,如果它是唯一的和簡短的,但更常見的策略是僅使用唯一的數字或其他對用戶無意義的值,但用於隨時間唯一地識別配方,即使(for例如)名稱更改。在數據庫術語中,這是業務密鑰和替代密鑰之間的差異。兩者都是唯一標識符,但商業密鑰對用戶(例如名稱)有意義,而代理鍵則不具有。我的建議是使用代理鍵,因爲您可以縮短它,並且永遠不需要更改,因爲用戶不關心它。

請注意,如果您在任何Web服務調用中接受密鑰作爲參數,則必須對其進行驗證(或者在安全性問題時對其進行加密),因爲您永遠不知道客戶端是否會篡改它。

順便說一句,我在這裏做一個假設,客戶端「知道」最近選擇哪個配方,因此它可以忽略其他配方的響應。