2015-09-04 49 views
-1

我需要提供一些信息的請求,這些信息將用於填充表格視圖單元格的文本字段。然而該單元可以在請求結束之前重新使用。我怎樣才能將AFNetworking GET請求與uitableview單元相關聯,以便能夠在prepareForReuse中取消它?AFNetworking:如何將異步JSON請求與UITableViewCell關聯?

(如果我沒有使用AFNetworking這將是一個沒有腦子。)

回答

0

我不知道爲什麼AFNetworking產生很大的差別的問題。

我的解決方案是:

  1. 保持在自定義單元格當前請求的URL。
  2. 對網絡調用的完成塊中的單元格有一個弱引用,並捕獲請求的url。
  3. 清除preprareForReuse中單元格的網址。
  4. 在更新單元之前的網絡完成塊中,如果不更新單元(僅緩存數據或更新模型對象而不刷新單元),則檢查單元的捕獲的URL是否仍與單元的URL匹配。

我會傾向於讓網絡請求,在大多數情況下完成,但如果你使用的數據會話的任務,你可以存儲NSURLSessionDataTask在細胞並調用它cancel在prepareForReuse。 AFNetworking中可能還有其他選項,不容易取消。

+0

所以你實際上不會取消網絡請求? –

+0

我傾向於不會盡管我承擔相當小的要求,但您的情況可能會有所不同。另一個因素是,單元格很有可能會回滾,因此存儲或緩存完成的結果將是我常用的方法。 –

0

如果your're關聯在tableview中每個單元的AFHTTPRequestOperation,你可以管理並取消您的GET請求如下:

@property (nonatomic, strong) AFHTTPRequestOperation *operation; 


- (void)prepareForReuse{ 
    [super prepareForReuse]; 
    [self.operation cancel]; 
} 

AFHTTPRequestOperation根本的NSOperation的子類。

0

你不能。 UITableViewCell是非常臨時的。它不涉及你的表的特定行;它將被重用於不同的行。以下是您的操作:

  1. 緩存您要在行中顯示的數據。
  2. 當一個單元格被創建時,您嘗試使用緩存中的數據填充它。
  3. 如果失敗,則啓動異步請求。
  4. 當異步請求成功時,它將其數據存放在緩存中。然後它確定表中的哪一行包含剛下載的數據,並重新加載該行。
  5. 沒有你做任何事情,操作系統會要求你再次創建單元,這次數據在緩存中。請注意,單元格可能是完全不同的單元格,但會顯示相同的數據。

請注意,包含數據的行可能與啓動請求時包含數據的行不同。例如,用戶可能已添加或刪除表格中的項目,或更改了排序順序。

+0

這是一種通常需要的方法,但是我被壓入使用AFNetworking是一種一站式解決方案,適用於所有計算。 –