在 Swift 中,如何停止所有进程,直到从 UICOLLECTIONVIEW 中的 parse.com 检索到数据

2024-03-25

在 CollectionView 中,我显示来自 parse.com 的数据。成功找回。但无法在单元格中显示。我收到数组出站错误。我发现了错误,解析是异步运行的。但是,在解析结束之前,集合视图会被加载。所以我无法在单元格中显示值。它抛出一个错误。如何停止所有进程直到解析完全加载?请指导我。 我的编码如下:

//VIEWCONTROLLER having collectionView

var myList : NSArray = NSArray()

let obj_par = parse_retrive()
obj_par.parse_DB() //DATAS GOING TO RETRIVE FROM PARSE

story_collection_view.reloadData() //RELOADING COLLECTIONVIEW

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

        println("fifth")

        if(collectionView == date_collection_view)
        {
         :
         :
            return cell
        }

        else

        {
            var cell = collectionView.dequeueReusableCellWithReuseIdentifier("story_read", forIndexPath: indexPath) as story_reading_cell

  cell.story_title.text = myList.objectAtIndex(indexPath.row) as? String //ERROR: ARRAY OUTBOUND OF INDEX

            return cell
        }

    }

//解析_检索类

func parse_DB() {

        println("SECOND 10")

        par_query.findObjectsInBackgroundWithBlock({(NSArray objects, NSError error) in

            if (error != nil) {
                NSLog("error " + error.localizedDescription)
            }
            else {
                println("SECOND 13")
                let sql_store_obj1 = sql_to_store() //THIRD CLASS
                self.parse_obj_arr = NSArray(array: objects)
                var j : Int = self.parse_obj_arr.count
                for (var i : Int = 0; i < j; i++) {
                    self.par_object = self.parse_obj_arr.objectAtIndex(i) as PFObject
                    self.sto = self.par_object["story_title"] as String        //STORY TITLE FROM PARSE
                    self.sto_con = self.par_object["story_content"] as String  //STORY CONTENT FROM PARSE

                    self.sto_tit.append(self.sto)        //STORING IN ARRAY VAR
                    self.sto_cont.append(self.sto_con)   //STORING IN ARRAY VAR

                } //FOR ENDING

                sql_store_obj1.sto_title_arr = self.sto_tit
                sql_store_obj1.sto_content_arr = self.sto_cont
                sql_store_obj1.parse_to_sql()

            }//ELSE ENDING

        }) //PARSE QUERY ENDING

        println("SECOND")

    } 

//第三类

func parse_to_sql() {

        let appDel : AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        let context : NSManagedObjectContext = appDel.managedObjectContext!
        let ent = NSEntityDescription.entityForName("Sad", inManagedObjectContext: context)
        var newStory = story_sad_managed(entity: ent!, insertIntoManagedObjectContext: context)

        newStory.story_title = sto_title_arr
        newStory.story_content = sto_content_arr

        let request = NSFetchRequest(entityName: "STORY")
        request.predicate = NSPredicate(format: "story_title = %@", sto_title_arr)
        result  = context.executeFetchRequest(request, error: nil)!

        let sto_page_obj = story_page()
        sto_page_obj.myList = result //1st CLASS ARRAY 

    }

NOTE:所有代码均采用 Objective-C 编写,但此特定代码的翻译应该很简单。如果有人想编辑我的帖子以包含 Swift 代码,请随意,但请在帖子中保留 Objective-C。

我做什么(为了UICollectionView or UITableView) 是创建一个属性,通常称为isLoading像这样:

@property (assign, nonatomic) BOOL isLoading;

我通常这样初始化它:

- (void)viewDidLoad {
    [super viewDidLoad];
    // This could also be done in viewWillAppear/viewDidAppear
    // based on your needs/desires
    self.isLoading = NO;
    [self loadData];
}

- (void)loadData {
    if (self.isLoading == YES) {
        // Just in case a "loadData" call is made while one is pending...
        return;
    }
    // Prevent this method from firing again until 
    // data loading is done; prevent UICollectionView
    // from attempting to display missing data
    self.isLoading = YES;
    
    // Do whatever you need to do...
    
    // Clean up and prepare for UICollectionView
    self.isLoading = NO;
    [self.collectionView reloadData];
}

现在,真正的秘密当然是你必须在你的程序中实现逻辑。UICollectionViewDataSource有条件地显示数据的方法self.isLoading, 像这样:

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    if (self.isLoading == YES) {
        // You might want to return 0 or 1, 
        // depending on whether you have a "loading"
        // placeholder cell. Assume you do:
        return 1;        
    } else {
        // Return whatever is the correct number here
    
    }
}

一般来说,这就是我需要让屏幕延迟加载的全部内容UICollectionView直到解析查询正确返回。

当我有多个查询同时运行时,所有这些查询都应该在我认为数据加载完成之前返回,然后我创建一个BOOL属性为每个,设置适当的标志,并且我通过一个漏斗所有查询返回checkIfDone方法。像这样的东西:

@property (assign, nonatomic) BOOL data1Loaded;
@property (assign, nonatomic) BOOL data2Loaded;
@property (assign, nonatomic) BOOL data3Loaded;
@property (assign, nonatomic) BOOL data4Loaded;

- (void)loadData {
    if (self.isLoading == YES) {
        return;
    }
    self.isLoading   = YES;
    self.data1Loaded = NO;
    self.data2Loaded = NO;
    self.data3Loaded = NO;
    self.data4Loaded = NO;

    // Call each of the separate data loading methods...
    [self loadData1];
    [self loadData2];
    [self loadData3];
    [self loadData4];

    // Notice that I don't do any reloadData calls here...

}

- (void)loadData1 {
    PFQuery *query = // Some query creation...
    [query findObjectsInBackgroundWithBlock:
        ^(NSArray *objects, NSError *error) {
            if (error != nil) { 
                // Handle "got error"

            } else {
                // Handle "got good data"

            }
            // Either way, #1 is done, so:
            self.data1Loaded = YES;
            // This pattern checks for completion and
            // runs the completion code only when all
            // 4 (in this case) items/queries have returned
            [self checkIfDone];
        }
     ];
}

- (void)checkIfDone {
    if (self.data1Loaded == YES && 
        self.data2Loaded == YES && 
        self.data3Loaded == YES && 
        self.data4Loaded == YES) 
    {
        // Clean up and prepare for UICollectionView
        self.isLoading = NO;
        [self.collectionView reloadData];
    }
}

Caveat:这假设任何后续调用loadData将在后台发生,并且任何后续调用[collectionView reloadData]仅在查询调用结束时发生。如果有其他事情可能会打电话reloadData同时,您将需要更高级的逻辑来确保正确加载正确的数据。


边注:执行此类操作时,不要忘记向用户显示工作正在进行中的指示。我喜欢使用开源MBProgressHUD。可用在 GitHub 上 https://github.com/jdg/MBProgressHUD。我发现它对于完全按照你所说的去做是非常有价值的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Swift 中,如何停止所有进程,直到从 UICOLLECTIONVIEW 中的 parse.com 检索到数据 的相关文章

  • Swift 4.2 当键盘显示时使 tableView 的底部向上移动

    尽管我已经进行了搜索 但我对如何最好地解决这个问题感到困惑 我有一个 tableView 其中底部单元格是列表的输入 就像苹果提醒的工作方式一样 当列表中的项目太多时 键盘会覆盖列表 我看不到正在输入的内容 我认为我需要更改表视图的物理大小
  • 支持从右到左的纯布局

    iOS纯布局支持从右到左的语言吗 我们如何在阿拉伯语言的代码中实现它 而不需要去设置并选择区域和格式语言 Thanks 您可以通过在 Xcode gt 编辑方案 gt 运行 gt 选项 选项卡 gt 应用程序语言 gt 从右到左伪语言中选择
  • Swift TTS,无音频输出

    我尝试在我的应用程序 TTS 中集成 但如果单击按钮 则没有音频输出 这是按钮代码 struct VocabDetailView View var body some View HStack Button Play readOut text
  • 如何快速将 Int16 转换为两个 UInt8 字节

    我有一些二进制数据 将两个字节值编码为有符号整数 bytes 1 255 0xFF bytes 2 251 0xF1 Decoding 这相当简单 我可以提取一个Int16这些字节的值 Int16 bytes 1 lt lt 8 Int16
  • 是否可以在 RealmSwift 中使用枚举?

    我想做这样的事情 enum WeekDay case Monday Tuesday Wednesday Thursday Friday Saturday Sunday class Person Object dynamic var birt
  • Swit 中的函数式编程将数组元素分配到正确的“桶”

    我是函数式编程的新手 我的问题是我有一个主数组和固定数量的 目标 数组 我想根据每个元素的特定值将主数组中的元素分配到正确的结果数组中 我猜测一种方法是使用一个映射函数来遍历主数组元素 确定正确的 目标数组 值 基于某种逻辑 然后将元素添加
  • 如何判断变量是否是数组

    我有一个接受 Any 的 Swift 函数 我希望它能够接受字符串数组 整数数组 混合数组或数组数组等 它也可以只接受字符串或整数 等等 不在数组中 所以我有这个 private func parse parameter Any if pa
  • CoreData 和 SwiftUI:环境中的上下文未连接到持久存储协调器

    我正在尝试通过构建一个作业管理应用程序来自学核心数据 我的代码构建良好 应用程序运行正常 直到我尝试将新分配添加到列表中 我收到这个错误Thread 1 EXC BREAKPOINT code 1 subcode 0x1c25719e8 在
  • Swift 2.0 中的协议扩展方法调度

    我面临有关协议方法调度的问题 我有一个类层次结构 如下所示 protocol E func test extension E func test print jello class A E class B A func test print
  • 为什么 'self.self' 在 swift 中编译并运行?

    昨天我回顾了 Swift 中的一段代码 其中包括这一行 self self someProperty 这让我很惊讶 因为这个词self被保留并用作对当前实例的引用 起初我用其他语言检查了这种现象 但都给出了错误 这并不奇怪 但是 为什么它能
  • Xcode 6 代码编辑器异常行为

    截至最近 我在使用 Xcode 6 代码编辑器时遇到了一些麻烦 最终导致编辑窗口中的焦点快速变化 在编辑文本时跳转到同一文件中完全不同的位置 一切就是这样开始的 最近 编辑器拒绝上下滚动 挂起 停止显示行号或任何其他文本 我该怎么做才能让它
  • Swift:转义闭包捕获非转义参数“onCompletion”

    我的 swift 有问题 我正在尝试发送 API 请求 然后检索数据 但收到以下错误消息 Swift 转义闭包捕获非转义参数 onCompletion 有谁知道我该如何解决这个问题 提前致谢 Code class RestApiManage
  • UITableView 自动调整行大小约束在 iPhone 6Plus 上神秘破坏

    我有一个自定义的 UITableViewCell 它有一个缩略图和一堆文本 行高配置为使用自动计算 tableView estimatedRowHeight 129 tableView rowHeight UITableViewAutoma
  • Swift 从照片库中获取视频的 NSData

    我使用 UIImagePickerController 从我的库中选择视频 我需要提取视频文件的 NSData 我使用以下操作从我的库中选择视频 但我的数据似乎为零 但是我的 AVPlayer 播放生成的 NSURL 中的视频 所以我知道问
  • 如果两个数组包含相同的元素,无论这些元素出现的顺序如何,如何在 Swift 中检查?

    假设有两个数组 var array1 a b c var array2 b c a 我希望这两个数组的比较结果为真 以下 var array1 a b c var array2 b c a d 是假的 我怎样才能在 Swift 中实现这一点
  • 如何使用 Unicode 十六进制值 (UTF-16) 在 Swift 中表达字符串

    我想在 Swift 中使用十六进制值编写 Unicode 字符串 我已阅读文档 https developer apple com library prerelease ios documentation Swift Conceptual
  • 如何将计算值转换为文字以进行枚举初始化

    我遇到了枚举的问题 因为我想将 case 初始化为双精度值PI 180 有没有办法通过常量或一些时髦的魔法获取这个计算值并将其转换为文字 以便我可以初始化枚举 我宁愿不必做3 14 我宁愿使用该值的实际编译器和硬件计算表示 所以我的第一次尝
  • 当前位置在 Google 地图中不起作用

    我在 swift 3 中集成了谷歌地图 当地图屏幕出现而不显示当前位置时 我在 plist 文件中添加了两个键 并设置了 CLLocationManager delegate 和 requestAlwaysAuthorization cla
  • 在 Swift 中使用 Obj-C 完成块

    在 Objective C 中 我有一个完成块类定义为 File h typedef void MYCompletionBlock BOOL success NSDictionary result NSError error 然后 在 Sw
  • 将对象映射到 TableView 部分的 Swift 二维数组

    我想不出更好的方法来做到这一点 我将学生对象的所有属性映射到二维数组中 所以我的电视有几个部分 我也不能使用静态表视图 如果是这样 这个问题就不会存在 所以我在 TVC 中的代码 let currentUser PFUser current

随机推荐

  • Python中获取网络地址和网络掩码

    在我的 Python 脚本中 我需要检索运行脚本的计算机的 IP 地址及其网络地址和网络字节 至于IP地址 我在存档中找到了解决方案 import socket s socket socket socket AF INET socket S
  • 如何在 yii2 basic 中使用日期选择器?

    我想使用 yii2 datepicker 但我在实现它时遇到了麻烦 它不显示日期选择器 我不知道我的代码中缺少什么 我对这个yii还是个新手 div class row div class col lg 6 div class myproj
  • Firestore:使用 Flutter 添加或删除现有数组中的元素[重复]

    这个问题在这里已经有答案了 是否可以向存储在 Firestore 文档中的现有数组添加或删除元素 而不是获取数组 在本地添加元素并将其发送回存储 希望是的 您可以结合使用 update 方法来附加或删除元素FieldValue arrayU
  • 在 Django 中的多个应用程序中使用相同的静态文件

    我的Django项目分为几个应用程序 静态文件存储在每个应用程序中 如下所示 Project foo static css style css views py models py urls py bar static css style
  • std::map 中 std::string 的 Valgrind 内存泄漏

    这是 Valgrind 的输出 6519 at 0x4C25885 operator new unsigned long vg replace malloc c 319 6519 by 0x4EE65D8 std string Rep S
  • 删除 ASP.NET MVC 4 到应用程序根目录的路径中的尾部斜杠

    在我的 ASP NET MVC 4 应用程序中RouteConfig文件中 我注册了以下默认路由 routes MapRoute Default controller action id new controller home action
  • 设置 jQuery.data() 是否会触发事件?

    我想知道是否致电 domElement data key newValue 会触发一个我可以处理的事件吗 我尝试过绑定change但设置数据时不会触发此操作 我认为这个问题可能会问类似的问题 但具有约束力changeData也没用 jQue
  • 在 AndroidJunit 测试项目中运行 UiAutomatorTestcase

    我实际上正在尝试在 Android Junit Test 项目中实现一个简单的测试套件 该项目使用以下类 UiObject 用户界面选择器 UiAutomator测试用例 单击并打开 Android 设备上的 Messaging 应用程序
  • java中多线程环境下的静态方法行为

    class Clstest public static String testStaticMethod String inFileStr section 0 section 1 do something with inFileStr sec
  • 允许向 ChoiceType 字段添加新值

    I use Form Component并有一个选择类型字段 http symfony com doc current reference forms types choice html在呈现到选择字段的表单上 在客户端我使用选择2插件 h
  • 亚马逊 S3 URL 编码

    如果我有一个文件名 a d1 tttt sq jpg 当它上传到 Amazon S3 时 它会转换为这样 a d1 22 tttt 22 sq jpg 因此双引号被 URL 编码并且文件名本身被更改 必须使用编码的 URL 来获取文件 a
  • 如何杀死一个pid不断变化的进程?

    我知道我可以使用这个技巧if fork exit 0 改变当前进程的pid 因此 下面的程序的 pid 变化很快 如何杀死这样的进程 有没有比执行大量更好的方法killall procname直到一个人能够奔跑kill 在分叉之前 我知道这
  • 当图像大小不同时,如何格式化图像数据以进行训练/预测?

    我正在尝试训练对图像进行分类的模型 我遇到的问题是 它们的尺寸不同 我应该如何格式化我的图像 或模型架构 你没有说你在说什么架构 既然你说你想对图像进行分类 我假设它是一个部分卷积 部分完全连接的网络 如 AlexNet GoogLeNet
  • 使用匿名方法有任何开销吗?

    我想知道创建后台工作人员时使用匿名方法是否会产生任何开销 例如 public void SomeMethod BackgroundWorker worker new BackgroundWorker worker DoWork sender
  • 算术溢出相当于模运算吗?

    我需要在 C 中进行模 256 算术 那么我可以简单地做吗 unsigned char i i 代替 int i i i 1 256 不 没有什么可以保证unsigned char有八位 使用uint8 t from
  • 向 Apache Fop 添加注释

    我正在使用渲染 PDF阿帕奇 福普 我正在制作 XSLT 模板 用于将 xml 转换为 PDF 我想使用以下方法在输出 PDF 中添加注释阿帕奇 福普 我一直在搜索 它说 iText 支持向 pdf 添加注释 是否可以在 Apache Fo
  • wpf手动生成TreeViewItem容器

    我正在运行时创建一个 TreeView 它有几个节点 TreeViewItem 每个节点都有一个名称 最初它是崩溃的 单独的组合框显示所有 TreeViewItem 的名称 我必须根据所选名称突出显示 TreeViewItem 我正在使用递
  • 使用 scala 将 Spark 中的 DataFrame 单行转置为列

    我在这里看到这个问题 使用 scala 在 Spark 中转置数据帧而不进行聚合 https stackoverflow com questions 49392683 transpose dataframe without aggregat
  • 如何从 Javascript 调用 Objective-C?

    我有一个 WebView 我想从 JavaScript 调用 Objective C 中的视图 有人知道我该怎么做吗 我的 ViewController 中有这段代码 BOOL webView UIWebView webView2 shou
  • 在 Swift 中,如何停止所有进程,直到从 UICOLLECTIONVIEW 中的 parse.com 检索到数据

    在 CollectionView 中 我显示来自 parse com 的数据 成功找回 但无法在单元格中显示 我收到数组出站错误 我发现了错误 解析是异步运行的 但是 在解析结束之前 集合视图会被加载 所以我无法在单元格中显示值 它抛出一个