Cocoa .scrollToEndOfDocument หยุดทำงานหลังจากลองครั้งแรก

ฉันกำลังเขียนโปรแกรม MacOS ขนาดเล็กด้วย WebView ซึ่งโหลดเว็บไซต์ นี่เป็นหนึ่งในไซต์เหล่านั้นที่โหลดเนื้อหาเพิ่มเติมโดยอัตโนมัติเมื่อคุณเลื่อนไปที่ด้านล่าง เมื่อใกล้หมดอายุ ฉันกำลังพยายามเขียนโค้ดที่จะเลื่อนไปที่ด้านล่างของหน้าอย่างต่อเนื่องเพื่อให้มีการโหลดมากขึ้นเรื่อยๆ

สิ่งที่ฉันมีจนถึงตอนนี้คือ:

scrollToBottomTotalTimes = 10
self.myWebView.mainFrame.load(NSURLRequest(url: NSURL(string: urlString)! as URL) as URLRequest!)

func webView(_ sender: WebView!, didFinishLoadFor frame: WebFrame!) {

        var scrollToBottomCurrentTimes = 0
        while scrollToBottomCurrentTimes != scrollToBottomTotalTimes {
            scrollToBottomCurrentTimes += 1
            self.myWebView.scrollToEndOfDocument(self)
            sleep(2) //give the page some time to load
        }
}

วิธีนี้ใช้ได้ผลดีเพียงครั้งเดียว: หน้าเว็บโหลด เลื่อนไปที่ด้านล่าง และโหลดหน้าเว็บมากขึ้น

อย่างไรก็ตาม หลังจากนั้น WebView จะไม่เลื่อนอีกต่อไป แม้ว่าจะมีเวลาเพียงพอในการโหลดหน้าเว็บซ้ำก็ตาม ตำแหน่งบนหน้ายังคงเหมือนเดิมทุกประการ

ฉันรู้สึกว่า .scrollToEndOfDocument(self) ดูเหมือนจะตรวจไม่พบความจริงที่ว่าหน้าเว็บนั้นยาวขึ้น

มีวิธี 'อัปเดต' .scrollToEndOfDocument(self) เพื่อให้รู้ว่าส่วนล่างใหม่ของหน้าอยู่ตรงไหน?

ขอบคุณ!


person Giulio Crisanti    schedule 11.10.2016    source แหล่งที่มา


คำตอบ (1)


สำหรับฉันดูเหมือนว่าคุณกำลังใช้แนวทางที่ผิด สมมติว่ามีเนื้อหาใหม่มาถึง คุณอาจได้รับคำขอหลายรายการไปที่ didFinishLoadFor อย่างไรก็ตาม คุณกำลังทำการวนซ้ำภายในวิธีการด้วยโหมดสลีปภายในวิธีการซึ่งทำให้คุณบล็อกคิวหลักและปิดการใช้งานกลไกเหตุการณ์

ฉันขอแนะนำให้คุณตั้งค่าเหตุการณ์ตัวจับเวลาโดยใช้ Grand Central Dispatch (GCD) จากนั้นปิดเหตุการณ์การเลื่อนจากเหตุการณ์ตัวจับเวลา โปรดทราบว่าคุณต้องทำการเลื่อนในคิวหลักและเหตุการณ์ตัวจับเวลาไม่อยู่ในคิวหลัก เพียงตรวจสอบเอกสารประกอบใน GCD ดู https://developer.apple.com/reference/dispatch

person Fred Appelman    schedule 28.01.2017