Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 取消NSJSONSerialization-键入时搜索,请求重叠_Ios_Xcode_Nsurlconnection_Nsjsonserialization - Fatal编程技术网

Ios 取消NSJSONSerialization-键入时搜索,请求重叠

Ios 取消NSJSONSerialization-键入时搜索,请求重叠,ios,xcode,nsurlconnection,nsjsonserialization,Ios,Xcode,Nsurlconnection,Nsjsonserialization,与iPhone-Facebook应用程序搜索功能类似,我在应用程序中输入搜索功能时实现搜索,尽管我在将数据解码为JSON格式时遇到问题 基本上,这是因为一些搜索比其他搜索花费的时间更长,它们以不同的间隔返回,当数据显示在屏幕上时,这会导致一些小的视觉问题 每次解码后,我都会使用NSJSONSerialization为关键字“industry”设置一个NSLOG 2013-04-09 23:38:18.941 Project Name [42836:1d03] http://fooWebAddre

与iPhone-Facebook应用程序搜索功能类似,我在应用程序中输入搜索功能时实现搜索,尽管我在将数据解码为JSON格式时遇到问题

基本上,这是因为一些搜索比其他搜索花费的时间更长,它们以不同的间隔返回,当数据显示在屏幕上时,这会导致一些小的视觉问题

每次解码后,我都会使用NSJSONSerialization为关键字“industry”设置一个NSLOG

2013-04-09 23:38:18.941 Project Name [42836:1d03] http://fooWebAddress/json/?method=search&limit=10&q=indus
2013-04-09 23:38:19.776 Project Name [42836:3e07] http://fooWebAddress/json/?method=search&limit=10&q=indu
2013-04-09 23:38:20.352 Project Name [42836:8803] http://fooWebAddress/json/?method=search&limit=10&q=indust
2013-04-09 23:38:21.814 Project Name [42836:4e03] http://fooWebAddress/json/?method=search&limit=10&q=industr
2013-04-09 23:38:23.434 Project Name [42836:8803] http://fooWebAddress/json/?method=search&limit=10&q=ind
2013-04-09 23:38:24.070 Project Name [42836:7503] http://fooWebAddress/json/?method=search&limit=10&q=industry
正如你所看到的,一切都出了问题

是否有人有任何方法可以停止上一个连接的NSJSONSerialization。 或者有没有其他方法来解决这个问题


NSJSONSerialization的步骤

  • NSURLRequest(initwithURL)
  • NSOperationQueue
  • NSURLConnection(异步)
  • NSJ串行化

  • 提前谢谢

    这是一个比仅仅取消
    NSJSONSerialization
    更复杂的问题。我的建议是使用
    NSFetchedResultsController
    填充显示搜索结果的表视图。将搜索项用作附加到
    NSFetchedResultsController
    NSFetchRequest
    中的谓词变量之一。然后,当您使用
    NSJSONSerialization
    解析结果时,使用与该请求关联的搜索词存储结果。一旦搜索词发生更改(用户键入更多字符时可以检测到),请重新创建
    NSFetchedResultsController
    并重新加载表视图。此外,如果使用performSelector:withObject:afterDelay启动该调用,则还可以尝试取消该调用以分析以前的结果。请注意,这不能总是可靠的,因为呼叫可能在您尝试取消时已启动

    当用户开始键入更多文本时,您可以取消以前的连接并忽略从他们那里收到的任何其他代理回调。然后对当前文本发出新请求

    您可以通过维护某种类型的
    lastRequest
    lastOperation
    引用来实现这一点。当用户开始键入时,调用
    [self.lastRequestOrOperation cancel]
    并在任何回调中使用类似于
    if(request!=self.lastRequest){return;}
    的复选框忽略来自该请求的任何进一步通知

    然而,这有一个问题,如果用户持续键入一段时间,您会不断取消请求,并且在用户停止键入之前,他们可能看不到任何结果


    更好的解决方案是添加排序,以便每个请求都与一个不断增加的序列ID相关联。然后,只有当响应的顺序高于上一次收到的顺序时,才解析结果并更新UI。如果您收到以前的任何带外响应,您只需忽略它们。

    有点基本,但您始终可以维护子类NSURLRequests(子类以提供标记)的nsdictionary

    开始请求-将请求添加到Indicationary,标记为array.count-1,键与标记匹配 连接返回-请求是否是最近的请求,如果是,请解析json Parse JSON—请求是否是最近的请求,如果是,则显示结果;如果不是,则仅在没有显示以前的结果时显示 请求处理-从字典中删除密钥


    最近的请求=字典是否包含键值更高的对象当前要做的是,键入每个字符并调用web服务。为什么要为您键入的每封信调用web服务。如果用户连续输入,则会增加负载,因此只有在用户停止特定时间间隔时才调用web服务。然后将该字符串传递给调用web服务或您正在调用的任何方法

    [NSObject cancelPerformSelectorsWithTarget:self]; // This will cancel your all req which is going to make when user typing without stopping 
    [self performSelector:@selector(sendSearchRequest) withObject:searchText afterDelay:0.1f]; // This will pass the string to call a web-service method, on which user hold for some time.
    

    您是否取消了以前的操作(若取消,如何取消)?只需等待用户停止键入,然后只调用web服务。在用户连续键入之间,使用下面的代码取消调用web服务的上一个请求。[NSObject CancelPerformSelectors with target:self];[自执行选择器:@selector(sendSearchRequest)with object:searchText afterDelay:0.1f];