มาบกิต. รับสถานที่ใกล้เคียงจากเซิร์ฟเวอร์และอาจแคชสถานที่เหล่านั้น (เช่น สำหรับการใช้งานออฟไลน์)

ฉันกำลังพัฒนาแอป iOS 5 ซึ่งฉันต้องการสื่อสารกับเซิร์ฟเวอร์โดยให้ข้อมูลเกี่ยวกับสถานที่ใกล้เคียงสำหรับตำแหน่งที่กำหนด: ตำแหน่งสถานที่และคำอธิบายประกอบ ฉันต้องการใช้ MapKit เพื่อเติมข้อมูลนี้ในแผนที่ของฉัน

ฉันไม่พบข้อมูลที่ตรงไปตรงมาเกี่ยวกับคำถามต่อไปนี้:

  1. MapKit มีฟังก์ชันการทำงานแบบแยกส่วน (แบบ Google Maps) นอกกรอบหรือไม่ และฉันจำเป็นต้องแก้ไขเพิ่มเติมหรือไม่ หากไม่
  2. แนวปฏิบัติที่ดีที่สุดในการดึงข้อมูลสถานที่ (ตำแหน่งเครื่องหมายและคำอธิบายประกอบ) จากเซิร์ฟเวอร์คืออะไร
  3. เป็นไปได้ไหมที่จะแคชข้อมูลนี้เพื่อให้ผู้ใช้สามารถเห็นสถานที่ใกล้เคียงของ "เมืองของเขา" ในโหมดออฟไลน์

จริงๆ แล้วคำถามที่ 2 และ 3 มีความสัมพันธ์กัน โดยทั้งสองข้อกล่าวถึงปัญหาการไม่ดึงข้อมูล (สถานที่ + คำอธิบายประกอบ) ที่มีอยู่บนแผนที่หลายครั้ง

หวังว่าฉันจะไม่มองข้ามบางสิ่งที่ชัดเจนที่นี่

ขอบคุณ!

อัปเดต 1: (เกี่ยวกับสถานที่ ไม่ใช่แผนที่) โดยเฉพาะอย่างยิ่งฉันสนใจ ฉันจะสร้างไทล์ลอจิคัล "ที่สร้างขึ้นด้วยมือ" สำหรับภูมิภาคที่มีสถานที่ที่ฉันดึงมาจากเซิร์ฟเวอร์ได้อย่างไร ดังนั้นพวกเขาจึงไม่จำเป็นต้องดึงข้อมูลตัวเองใหม่เมื่อผู้ใช้เลื่อน แผนที่? ฉันรู้ว่าฉันสามารถใช้งานฟังก์ชันนี้ด้วยตนเองได้ ตัวอย่างเช่น ฉันควรเขียนตำแหน่งที่เพิ่งดึงข้อมูลไปยังที่จัดเก็บในเครื่องโดยใช้ Core Data ทันทีหลังจากดึงข้อมูลหรือจัดระเบียบคิวบางส่วนหรือไม่ หรือฉันจะทราบได้อย่างไรว่าเมื่อใดที่ฉันต้องดำเนินการร้องขอเกี่ยวกับภูมิภาคเฉพาะบนเซิร์ฟเวอร์ และเมื่อใดที่ฉันเพิ่งดึงข้อมูลในเครื่องที่มีอยู่แล้วบนอุปกรณ์ ฉันแค่อยากรู้ว่ามีแนวทางและแนวทางปฏิบัติที่แนะนำหรือไม่? หวังว่าฉันจะเขียนมันชัดเจนที่นี่

อัปเดต 2: ฉันสงสัยเกี่ยวกับแนวทางปฏิบัติที่ดีที่สุดที่นี่ (ลิงก์ตัวอย่าง) ที่จะไม่เริ่มสร้างทั้งหมดนี้ (จุดที่ 2+3) ตั้งแต่เริ่มต้น มีเฟรมเวิร์กใดบ้างที่รวมบทช่วยสอนนี้หรือบทช่วยสอนที่ดีไว้?


person Stanislav Pankevich    schedule 07.09.2012    source แหล่งที่มา


คำตอบ (2)


@Stanislaw - เราได้นำฟังก์ชันที่คุณอธิบายไว้ในแอปที่เรียกว่า PreventConnect สำหรับลูกค้าของเรารายหนึ่ง ลูกค้ามีข้อมูลบางส่วนเก็บไว้ในตาราง Google Fusion แล้ว เราขยายโซลูชันที่มีอยู่โดยเพิ่มตาราง Google Fusion อีกตารางหนึ่งซึ่งจัดเก็บพิกัดทางภูมิศาสตร์สำหรับสถานที่หลายแห่ง ทั้งหมดนี้เพื่อตอบคำถามของคุณ...

1) ส่วนของแผนที่นั้นค่อนข้างจะแกะกล่อง มีไทล์และอะไรที่ไม่ใช่ แต่คุณจะต้องเขียนโค้ดเพื่อให้ได้ขอบเขตการซูม การปักหมุด คำอธิบายประกอบ และสิ่งต่าง ๆ ที่ทำงานในลักษณะที่คุณคาดหวังให้มันทำงาน .

2) เราพบว่าโซลูชัน Google Fusion ค่อนข้างมีประสิทธิภาพ หากคุณไม่ต้องการใช้ Google Fusion มีผู้ให้บริการฐานข้อมูลระบบคลาวด์รายอื่นๆ เช่น StackMob, Database.com และอื่นๆ อีกมากมาย Google ให้บริการฟรีและมี iOS SDK ที่ทำให้การสื่อสารกับ Google Fusion เป็นเรื่องง่าย

3) แน่นอน! เราแคชข้อมูลจำนวนมากไว้ในที่เก็บข้อมูลหลักภายในอุปกรณ์ สิ่งนี้ช่วยปรับปรุงประสิทธิภาพและการตอบสนองอย่างมาก

person radesix    schedule 07.09.2012
comment
rasesix ขอบคุณสำหรับคำตอบของคุณ ฉันพบว่ามันคลุมเครือมากเกินไป ในจุดที่ 2 - ฉันไม่จำเป็นต้องทำงานกับผู้ให้บริการฐานข้อมูล - ฉันมีเซิร์ฟเวอร์ระยะไกลแทน: ฉันได้รับข้อมูลเกี่ยวกับสถานที่จากที่นั่นโดยใช้ API (ดังนั้นสตริง GF จึงไม่เกี่ยวข้องโดยสิ้นเชิง) ประเด็นที่ 1 - คือสิ่งที่ฉันมีในใจเมื่อถามคำถาม - คุณแค่ยืนยันด้วยความคิด ขอบคุณ ประเด็นที่ 3 - ฉันน่าจะสนใจที่จะทราบแนวทางที่เป็นที่รู้จักมากกว่า ฉันอัปเดตคำถามพร้อมรายละเอียดเพิ่มเติม หวังว่าคำถามจะอธิบายสิ่งที่ฉันต้องการได้ชัดเจนยิ่งขึ้น - person Stanislav Pankevich; 09.09.2012
comment
radesix ขออภัยที่สะกดผิดเมื่อเขียนชื่อของคุณ - person Stanislav Pankevich; 09.09.2012

ถึงเวลาเขียนคำตอบที่ชัดเจนสำหรับคำถามของฉันนี้ (ฉันสามารถเขียนได้เมื่อปีที่แล้ว แต่อย่างใดฉันก็ลืมมันไปจากใจ)


MapKit มีฟังก์ชันการทำงานแบบแยกส่วน (แบบ Google Maps) นอกกรอบหรือไม่ และฉันจำเป็นต้องแก้ไขเพิ่มเติมหรือไม่ หากไม่

คำตอบคือใช่: MapKit มีอยู่ คำหลักที่นี่คือ overlays (MKOverlay, MKOverlayView and others) ดูคำตอบอื่นของฉัน

ดูสิ่งนี้ด้วย:

เซสชัน WWDC 2010: การปรับแต่งแผนที่ด้วยภาพซ้อนทับ,

Apple-WWDC10-TileMap


แนวปฏิบัติที่ดีที่สุดในการดึงข้อมูลสถานที่ (ตำแหน่งเครื่องหมายและคำอธิบายประกอบ) จากเซิร์ฟเวอร์คืออะไร

จริงๆ แล้วตั้งแต่นั้นมา ฉันไม่ได้เรียนรู้มากนักเกี่ยวกับ "แนวทางปฏิบัติที่ดีที่สุด" - น่าเสียดายที่ไม่มีใครบอกฉันเกี่ยวกับสิ่งเหล่านั้น :( - นั่นคือเหตุผลที่ฉันจะอธิบาย "แนวทางปฏิบัติของฉัน"

ประการแรก มีสองกลยุทธ์ในการเติมแผนที่ MapKit ด้วยสถานที่ต่างๆ:

กลยุทธ์แรกคือการเติมสถานที่ลงในแผนที่ของคุณตามความต้องการ: ลองจินตนาการว่าคุณต้องการแสดงและดูสถานที่ใกล้เคียงทั้งหมด (เช่น ไม่เกิน 1 กม. จากตำแหน่งปัจจุบันของผู้ใช้) - วิธีการนี้จะถือว่าคุณ ถามเซิร์ฟเวอร์ของคุณเฉพาะสถานที่สำหรับกล่องที่คุณสนใจ ซึ่งหมายถึง "ถ้าฉันอยู่ในเบอร์ลิน (และคาดว่าจะมีที่ 200 แห่งสำหรับเบอร์ลิน) ทำไมฉันต้องไปรับสถานที่จากรัสเซีย ญี่ปุ่น .. . (มากกว่า 10,000 แห่ง)"

แนวทางนี้นำไปสู่การอาศัยฟังก์ชัน "ไทล์" ที่ตั้งคำถามเกี่ยวกับที่อยู่ N1: โดยปกติแล้วแผนที่ของ Google และแผนที่ของ Apple จะถูกวาดโดยใช้ "ไทล์" ดังนั้นสำหรับส่วน "เบอร์ลิน" ของแผนที่ คุณจะต้องใช้ไทล์ "เบอร์ลิน" ที่เกี่ยวข้องซึ่งวาดโดย MKMapView - คุณใช้มิติข้อมูลเพื่อถามเซิร์ฟเวอร์ของคุณเฉพาะสถานที่ภายในกล่อง "เบอร์ลิน" (ดูคำตอบที่เชื่อมโยงของฉันและแอปสาธิตที่นั่น)

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

กลยุทธ์ที่สอง คือการดึงสถานที่ทั้งหมดในคราวเดียว (ใช่ ทั้งหมดนี้มากกว่า 10,000 แห่งขึ้นไป) และใช้ข้อมูลหลักเพื่อดึงสถานที่ที่จำเป็นสำหรับส่วนที่มองเห็นได้ของแผนที่ที่คุณสนใจ

แนวทางที่สองหมายความว่าในระหว่างการรันครั้งแรก คุณส่งคำขอเซิร์ฟเวอร์ของคุณเพื่อดึงข้อมูลสถานที่ทั้งหมด (ฉันมีประมาณ 2,000 แห่งในแอปของฉัน) สิ่งสำคัญที่นี่คือ คุณต้องจำกัดฟิลด์ที่คุณดึงข้อมูลไว้เฉพาะพื้นที่ทางภูมิศาสตร์ที่คุณต้องการจริงๆ สำหรับแผนที่ของคุณ: id, latitude, longitude

การดึงข้อมูลแบบ 'ดึงข้อมูลทั้งหมด' นี้มีผลกระทบอย่างมากต่อเวลาเริ่มต้นครั้งแรกของแอปของฉัน (ใน iPhone 4 ที่ "เก่าที่สุด" ฉันมีเวลาเกือบ 700ms สำหรับกระบวนการ Fetch + Parse-JSON-into-Core-Data ทั้งหมด และการวัดประสิทธิภาพที่ครอบคลุมแสดงให้ฉันเห็นว่า นี่คือข้อมูลหลักและ ส่วนแทรกนั้นเป็นคอขวด) แต่จากนั้นคุณก็จะมีข้อมูลทางภูมิศาสตร์ที่จำเป็นทั้งหมดเกี่ยวกับสถานที่ของคุณบนอุปกรณ์ของคุณ

โปรดทราบว่าไม่ว่าคุณจะใช้กลยุทธ์ใดก็ตาม คุณควรดำเนินการดึงข้อมูลจุดทางภูมิศาสตร์เหล่านี้อย่างมีประสิทธิภาพ:

ลองนึกภาพเอนทิตี Core Data Place ซึ่งมีโครงสร้างฟิลด์ต่อไปนี้ (โค้ด preudo-Objective-C):

// Unique identificator
NSNumber *id,

// Geo info
NSNumber *latitude,
NSNumber *longitude,

// The rest "heavy" info  
NSString *name,
NSString *shortDescription,
NSString *detailedDescription, etc

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

ดูหัวข้อยอดนิยมนี้ด้วย: ปรับปรุงกระบวนการฐานข้อมูลเซิร์ฟเวอร์มิเรอร์ไปยังฐานข้อมูลไคลเอนต์ผ่าน JSON หรือไม่

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

ลิงก์ที่เกี่ยวข้องในการจัดกลุ่ม:

เซสชัน WWDC 2011: การแสดงภาพข้อมูลทางภูมิศาสตร์ด้วย MapKit,

วิธีแสดงข้อมูลจำนวนมากบน iOS อย่างมีประสิทธิภาพ แผนที่,

สิ่งสำคัญ - โซลูชันการทำคลัสเตอร์แบบโอเพนซอร์ส: มีประสิทธิภาพและใช้งานง่าย


เป็นไปได้ไหมที่จะแคชข้อมูลนี้เพื่อให้ผู้ใช้สามารถเห็นสถานที่ใกล้เคียงของ "เมืองของเขา" ในโหมดออฟไลน์

ใช่ ทั้งสองกลยุทธ์ทำเช่นนี้: วิธีแรกแคชสถานที่ที่คุณเห็นบนแผนที่ของคุณ - หากคุณสังเกตเห็นส่วนของแผนที่เบอร์ลิน คุณจะมีส่วนของเบอร์ลินถูกแคช...

เมื่อใช้กลยุทธ์ที่สอง: คุณจะมีข้อมูลทางภูมิศาสตร์ที่จำเป็นทั้งหมดเกี่ยวกับสถานที่ของคุณที่แคชไว้และพร้อมที่จะวาดบนแผนที่ในโหมดออฟไลน์ (สมมติว่า MapKit แคชภาพแผนที่ของภูมิภาคที่คุณเรียกดูในโหมดออฟไลน์)

person Stanislav Pankevich    schedule 26.01.2014