instantsearch-ios icon indicating copy to clipboard operation
instantsearch-ios copied to clipboard

Infinite requests when using LazyVGrid on MacOS

Open jeromedoyle opened this issue 2 years ago • 1 comments

Describe the bug 🐛 I'm building a MacOS app and would like to display returned hits in a grid view. I have a UI that consists of a SearchBar, HitList, and some facets. I've made a CustomHitsList that is identical to HitsList except for using a LazyVGrid instead of a LazyVStack to display the returned hits. When searching, things hang up with what appears to be infinite API calls to the Algolia API. In XCode, I see this:

2022-06-03 07:49:40.489316-0500 p4a-app[46057:19480005] *** _TtGC19AlgoliaSearchClient11HTTPRequestVS_19MultiSearchResponseS1__ 0x7fb47d782b60 went isFinished=YES without being started by the queue it is in
2022-06-03 07:49:47.223250-0500 p4a-app[46057:19480015] Task <B4CCFE12-70A7-4A17-AD62-D6DBDA5C8762>.<1203> finished with error [-1001] Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo={_kCFStreamErrorCodeKey=-2102, NSUnderlyingError=0x600001c9c990 {Error Domain=kCFErrorDomainCFNetwork Code=-1001 "(null)" UserInfo={_kCFStreamErrorCodeKey=-2102, _kCFStreamErrorDomainKey=4}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <B4CCFE12-70A7-4A17-AD62-D6DBDA5C8762>.<1203>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <B4CCFE12-70A7-4A17-AD62-D6DBDA5C8762>.<1203>"
), NSLocalizedDescription=The request timed out., NSErrorFailingURLStringKey=https://sorpcr673c-dsn.algolia.net/1/indexes/*/queries, NSErrorFailingURLKey=https://sorpcr673c-dsn.algolia.net/1/indexes/*/queries, _kCFStreamErrorDomainKey=4}
2022-06-03 07:49:47.223804-0500 p4a-app[46057:19480015] Task <D77F5FA4-D243-4B64-A579-346E8FBCE103>.<1204> finished with error [-1001] Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo={_kCFStreamErrorCodeKey=-2102, NSUnderlyingError=0x600001c996e0 {Error Domain=kCFErrorDomainCFNetwork Code=-1001 "(null)" UserInfo={_kCFStreamErrorCodeKey=-2102, _kCFStreamErrorDomainKey=4}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <D77F5FA4-D243-4B64-A579-346E8FBCE103>.<1204>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <D77F5FA4-D243-4B64-A579-346E8FBCE103>.<1204>"
), NSLocalizedDescription=The request timed out., NSErrorFailingURLStringKey=https://sorpcr673c-dsn.algolia.net/1/indexes/*/queries, NSErrorFailingURLKey=https://sorpcr673c-dsn.algolia.net/1/indexes/*/queries, _kCFStreamErrorDomainKey=4}
2022-06-03 07:49:47.224648-0500 p4a-app[46057:19480015] Task <FB6DD513-FD53-4DFA-B09D-972ED994EAF8>.<1205> finished with error [-1001] Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo={_kCFStreamErrorCodeKey=-2102, NSUnderlyingError=0x600001cada10 {Error Domain=kCFErrorDomainCFNetwork Code=-1001 "(null)" UserInfo={_kCFStreamErrorCodeKey=-2102, _kCFStreamErrorDomainKey=4}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <FB6DD513-FD53-4DFA-B09D-972ED994EAF8>.<1205>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <FB6DD513-FD53-4DFA-B09D-972ED994EAF8>.<1205>"
), NSLocalizedDescription=The request timed out., NSErrorFailingURLStringKey=https://sorpcr673c-dsn.algolia.net/1/indexes/*/queries, NSErrorFailingURLKey=https://sorpcr673c-dsn.algolia.net/1/indexes/*/queries, _kCFStreamErrorDomainKey=4}
2022-06-03 07:49:47.225191-0500 p4a-app[46057:19480004] Task <819B4034-056C-4CE1-96DB-57DEEA407CB3>.<1206> finished with error [-1001] Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo={_kCFStreamErrorCodeKey=-2102, NSUnderlyingError=0x600001cac1e0 {Error Domain=kCFErrorDomainCFNetwork Code=-1001 "(null)" UserInfo={_kCFStreamErrorCodeKey=-2102, _kCFStreamErrorDomainKey=4}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <819B4034-056C-4CE1-96DB-57DEEA407CB3>.<1206>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <819B4034-056C-4CE1-96DB-57DEEA407CB3>.<1206>"
), NSLocalizedDescription=The request timed out., NSErrorFailingURLStringKey=https://sorpcr673c-dsn.algolia.net/1/indexes/*/queries, NSErrorFailingURLKey=https://sorpcr673c-dsn.algolia.net/1/indexes/*/queries, _kCFStreamErrorDomainKey=4}
2022-06-03 07:49:47.229017-0500 p4a-app[46057:19480004] Task <665EFB69-963E-4A2F-B924-1DEAA5F80768>.<1207> finished with error [-1001] Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo={_kCFStreamErrorCodeKey=-2102, NSUnderlyingError=0x600001caf9f0 {Error Domain=kCFErrorDomainCFNetwork Code=-1001 "(null)" UserInfo={_kCFStreamErrorCodeKey=-2102, _kCFStreamErrorDomainKey=4}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <665EFB69-963E-4A2F-B924-1DEAA5F80768>.<1207>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <665EFB69-963E-4A2F-B924-1DEAA5F80768>.<1207>"
), NSLocalizedDescription=The request timed out., NSErrorFailingURLStringKey=https://sorpcr673c-dsn.algolia.net/1/indexes/*/queries, NSErrorFailingURLKey=https://sorpcr673c-dsn.algolia.net/1/indexes/*/queries, _kCFStreamErrorDomainKey=4}
2022-06-03 07:49:47.229168-0500 p4a-app[46057:19480004] Task <1FC48996-393B-4592-9B92-41A5038B3B48>.<1208> finished with error [-1001] Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo={_kCFStreamErrorCodeKey=-2102, NSUnderlyingError=0x600001c9b780 {Error Domain=kCFErrorDomainCFNetwork Code=-1001 "(null)" UserInfo={_kCFStreamErrorCodeKey=-2102, _kCFStreamErrorDomainKey=4}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <1FC48996-393B-4592-9B92-41A5038B3B48>.<1208>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <1FC48996-393B-4592-9B92-41A5038B3B48>.<1208>"
), NSLocalizedDescription=The request timed out., NSErrorFailingURLStringKey=https://sorpcr673c-dsn.algolia.net/1/indexes/*/queries, NSErrorFailingURLKey=https://sorpcr673c-dsn.algolia.net/1/indexes/*/queries, _kCFStreamErrorDomainKey=4}
2022-06-03 07:49:47.229278-0500 p4a-app[46057:19480004] Task <1C8FFC4D-09B0-4A81-80E6-644D060413E3>.<1209> finished with error [-1001] Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo={_kCFStreamErrorCodeKey=-2102, NSUnderlyingError=0x600001caf930 {Error Domain=kCFErrorDomainCFNetwork Code=-1001 "(null)" UserInfo={_kCFStreamErrorCodeKey=-2102, _kCFStreamErrorDomainKey=4}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <1C8FFC4D-09B0-4A81-80E6-644D060413E3>.<1209>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <1C8FFC4D-09B0-4A81-80E6-644D060413E3>.<1209>"
), NSLocalizedDescription=The request timed out., NSErrorFailingURLStringKey=https://sorpcr673c-dsn.algolia.net/1/indexes/*/queries, NSErrorFailingURLKey=https://sorpcr673c-dsn.algolia.net/1/indexes/*/queries, _kCFStreamErrorDomainKey=4}

I've read through #207. I believe it's related and understand the explanation of the behavior, but am wondering if there's any way to make it work with a LazyVGrid.

Expected behavior 💭 Hits are displayed properly in a LazyVGrid without triggering an infinite amount of API calls.

Environment:

  • OS: MacOS
  • Version 12.3.1

jeromedoyle avatar Jun 03 '22 12:06 jeromedoyle

Hi @jeromedoyle, Thank you for reporting this.

I tried to build a HitsList equivalent using LazyVGrid and it works well.

  struct HitsGrid<Cell: View, Item: Codable, NoResults: View>: View {
    
    @ObservedObject public var hitsController: HitsObservableController<Item>
    
    /// Closure constructing a hit cell view
    public var cell: (Item?, Int) -> Cell

    /// Closure constructing a no results view-
    public var noResults: (() -> NoResults)?
    
    private let columns = [
        GridItem(.flexible()),
        GridItem(.flexible()),
    ]

    public init(_ hitsObservable: HitsObservableController<Item>,
                @ViewBuilder cell: @escaping (Item?, Int) -> Cell,
                @ViewBuilder noResults: @escaping () -> NoResults) {
      self.hitsController = hitsObservable
      self.cell = cell
      self.noResults = noResults
    }
    
    public var body: some View {
      if let noResults = noResults?(), hitsController.hits.isEmpty {
        noResults
      } else {
        ScrollView(showsIndicators: false) {
          LazyVGrid(columns: columns, spacing: 10) {
            ForEach(0..<hitsController.hits.count, id: \.self) { index in
              cell(atIndex: index)
            }
          }
          .padding(.horizontal)
        }.id(hitsController.scrollID)
      }
    }

    private func cell(atIndex index: Int) -> some View {
      cell(hitsController.hits[index], index).onAppear {
        hitsController.notifyAppearanceOfHit(atIndex: index)
      }
    } 
  }

Could you try it?

VladislavFitz avatar Jun 23 '22 13:06 VladislavFitz

Hi @jeromedoyle , Due to a lack of response from your side, I close this issue. Feel free to reopen it providing more details.

VladislavFitz avatar Oct 21 '22 16:10 VladislavFitz

Hey @VladislavFitz, I am getting the same issue but not using a LazyVGrid. @jeromedoyle Did you find a solution to your issue?

The issue is intermittent and I can not find the exact behavior leading to the issue. I am using $searchBoxController.query as the text of my searchBar, so the onQueryChanged is called for every text change.

2023-06-22 01:00:14.267210-0400 Aissistant[79656:27677207] *** _TtGC19AlgoliaSearchClient11HTTPRequestVS_19MultiSearchResponseS1__ 0x156535cb0 went isFinished=YES without being started by the queue it is in
2023-06-22 01:00:15.573726-0400 Aissistant[79656:27678053] *** _TtGC19AlgoliaSearchClient11HTTPRequestVS_19MultiSearchResponseS1__ 0x1595f3ba0 went isFinished=YES without being started by the queue it is in
2023-06-22 01:00:15.855572-0400 Aissistant[79656:27678050] *** _TtGC19AlgoliaSearchClient11HTTPRequestVS_19MultiSearchResponseS1__ 0x159794460 went isFinished=YES without being started by the queue it is in
2023-06-22 01:00:16.081796-0400 Aissistant[79656:27677328] *** _TtGC19AlgoliaSearchClient11HTTPRequestVS_19MultiSearchResponseS1__ 0x1597f3280 went isFinished=YES without being started by the queue it is in
2023-06-22 01:00:17.060302-0400 Aissistant[79656:27678050] *** _TtGC19AlgoliaSearchClient11HTTPRequestVS_19MultiSearchResponseS1__ 0x1567cc960 went isFinished=YES without being started by the queue it is in
2023-06-22 01:00:17.967393-0400 Aissistant[79656:27675849] Task <8503A592-4FDF-4AF7-88A2-4303112795AE>.<1855> finished with error [-1001] Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo={_kCFStreamErrorCodeKey=-2102, NSUnderlyingError=0x600006c09350 {Error Domain=kCFErrorDomainCFNetwork Code=-1001 "(null)" UserInfo={_kCFStreamErrorCodeKey=-2102, _kCFStreamErrorDomainKey=4}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <8503A592-4FDF-4AF7-88A2-4303112795AE>.<1855>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <8503A592-4FDF-4AF7-88A2-4303112795AE>.<1855>"
), NSLocalizedDescription=The request timed out., NSErrorFailingURLStringKey=https://w2p46x4qky-dsn.algolia.net/1/indexes/*/queries?X-Algolia-Agent=iOS%20(16.4);%20Algolia%20for%20Swift%20(8.18.0);%20InstantSearch%20iOS%20(7.25.1);%20ISTelemetry(H4sIAAAAAAAAE3ukLXRAlfEECDGdUGW7oMpwQ5XhkTbnAVVBMJsRzBaBsAFM9M0DLQAAAA%3D%3D);%20Algolia%20insights%20for%20iOS%20(8.18.0), NSErrorFailingURLKey=https://w2p46x4qky-dsn.algolia.net/1/indexes/*/queries?X-Algolia-Agent=iOS%20(16.4);%20Algolia%20for%20Swift%20(8.18.0);%20InstantSearch%20iOS%20(7.25.1);%20ISTelemetry(H4sIAAAAAAAAE3ukLXRAlfEECDGdUGW7oMpwQ5XhkTbnAVVBMJsRzBaBsAFM9M0DLQAAAA%3D%3D);%20Algolia%20insights%20for%20iOS%20(8.18.0), _kCFStreamErrorDomainKey=4}
2023-06-22 01:00:17.967702-0400 Aissistant[79656:27675849] Task <82E4CDE8-182B-45A0-B577-E4EB86ED7EA0>.<1856> finished with error [-1001] Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo={_kCFStreamErrorCodeKey=-2102, NSUnderlyingError=0x600006c0c240 {Error Domain=kCFErrorDomainCFNetwork Code=-1001 "(null)" UserInfo={_kCFStreamErrorCodeKey=-2102, _kCFStreamErrorDomainKey=4}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <82E4CDE8-182B-45A0-B577-E4EB86ED7EA0>.<1856>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <82E4CDE8-182B-45A0-B577-E4EB86ED7EA0>.<1856>"
), NSLocalizedDescription=The request timed out., NSErrorFailingURLStringKey=https://w2p46x4qky-dsn.algolia.net/1/indexes/*/queries?X-Algolia-Agent=iOS%20(16.4);%20Algolia%20for%20Swift%20(8.18.0);%20InstantSearch%20iOS%20(7.25.1);%20ISTelemetry(H4sIAAAAAAAAE3ukLXRAlfEECDGdUGW7oMpwQ5XhkTbnAVVBMJsRzBaBsAFM9M0DLQAAAA%3D%3D);%20Algolia%20insights%20for%20iOS%20(8.18.0), NSErrorFailingURLKey=https://w2p46x4qky-dsn.algolia.net/1/indexes/*/queries?X-Algolia-Agent=iOS%20(16.4);%20Algolia%20for%20Swift%20(8.18.0);%20InstantSearch%20iOS%20(7.25.1);%20ISTelemetry(H4sIAAAAAAAAE3ukLXRAlfEECDGdUGW7oMpwQ5XhkTbnAVVBMJsRzBaBsAFM9M0DLQAAAA%3D%3D);%20Algolia%20insights%20for%20iOS%20(8.18.0), _kCFStreamErrorDomainKey=4}
2023-06-22 01:00:17.968025-0400 Aissistant[79656:27677328] Task <D1E8C85E-796A-4AC1-8B56-D69E7D263AC4>.<1857> finished with error [-1001] Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo={_kCFStreamErrorCodeKey=-2102, NSUnderlyingError=0x600006c17a50 {Error Domain=kCFErrorDomainCFNetwork Code=-1001 "(null)" UserInfo={_kCFStreamErrorCodeKey=-2102, _kCFStreamErrorDomainKey=4}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <D1E8C85E-796A-4AC1-8B56-D69E7D263AC4>.<1857>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <D1E8C85E-796A-4AC1-8B56-D69E7D263AC4>.<1857>"
), NSLocalizedDescription=The request timed out., NSErrorFailingURLStringKey=https://w2p46x4qky-dsn.algolia.net/1/indexes/*/queries?X-Algolia-Agent=iOS%20(16.4);%20Algolia%20for%20Swift%20(8.18.0);%20InstantSearch%20iOS%20(7.25.1);%20ISTelemetry(H4sIAAAAAAAAE3ukLXRAlfEECDGdUGW7oMpwQ5XhkTbnAVVBMJsRzBaBsAFM9M0DLQAAAA%3D%3D);%20Algolia%20insights%20for%20iOS%20(8.18.0), NSErrorFailingURLKey=https://w2p46x4qky-dsn.algolia.net/1/indexes/*/queries?X-Algolia-Agent=iOS%20(16.4);%20Algolia%20for%20Swift%20(8.18.0);%20InstantSearch%20iOS%20(7.25.1);%20ISTelemetry(H4sIAAAAAAAAE3ukLXRAlfEECDGdUGW7oMpwQ5XhkTbnAVVBMJsRzBaBsAFM9M0DLQAAAA%3D%3D);%20Algolia%20insights%20for%20iOS%20(8.18.0), _kCFStreamErrorDomainKey=4}

Thanks for your help

jonSuits avatar Jun 22 '23 04:06 jonSuits