ریلود بعد از آخرین آیتم collection view
درود خدمت شما دوستان گرامی .
اگر بخواهیم به صورت یک جا کل json را از سرور بخوانیم ( مخصوصا وب سایت هایی که خروجی بسیار زیادی دارند ) یا اینترنت کاربر نمی کشد یا فشار زیادی به سرور وارد می کند . به همین منظور راه حلی که بهتر به نظر می رسه فراخوانی کم کم اطلاعات یا json هست مثل صفحه بندی هر سایت معمول در سایت.
حالا فکر کنید شما یک collection view دارید و می خواهید کاربر وقتی به آخرین cell شما رسید یک بار دیگر از سرور درخواست کند
یک راه حلی که من برای این مورد در نظر گرفتم به صورت زیر هست
func collectionView (_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
...
....
.....
if indexPath.item + 2 > classname.count {
print("lazy load")
}
من در کد بالا گفتم وقتی تعداد آیتم بیشتر از تعداد آرایه های کلاس پر شده است بیا و چاپ کن lazy load خوب تا اینجا خوب هست جواب گو ولی باز من احساس می کنم این مورد برخی موارد با تداخل در اینترنت کاربر دچار مشکل می شود و کاربر نمی تواند دوباره تلاش کند .
اگر بخواهد تلاش کند باید با اشاره گرد یا انگشتش برود اولین item بعد به سمت پایین بیاید تا کد کار کند وگرنه این شرط درست در نمی آید
شما برای صفحه بندی چه چیزی پیشنهاد می دهید لازم به ذکر هست این مورد در table view در صورتی که هر item تمام عرض را بگیرد مشکلی ندارد ولی در مواردی که از collection view استفاده می کنیم و تمام عرض اشغال نمی شود و ممکن هست چند مربع پایانی یک سوم کل عرض را بگیرند ممکن هست مشکل درست گردد
آیا فانکشنی وجود دارد که به آخرین item رسید این کارا را برای ما انجام بدهد ؟
یک مشکل بزرگ :
متاسفانه یک مشکلی هم در این وسط وجود داره . حالا شما فکر کنید با کد بالا انجام شد کاربر از سرور صفحه به صفحه اطلاعات را آورد و اطلاعات سایت تمام شد و حالا هرچی به پایین می کشد دیگر چیز جدیدی نمی آید !! تا اینجا درست ؟ اگر کاربر به بالا نرود و همان پایین بماند و کد ما به شرح زیر باشد
DispatchQueue.global(qos: .userInitiated).async {
// Bounce back to the main thread to update the UI
DispatchQueue.main.async {
self.collectionview.reloadData()
}
یعنی در بک گراند بیاید ui را رفرش کند . و هیچ داده ای واکشی نشود . چون چیزی وجود ندارد پشت هم رفرش شده و به شدت مصرف سی پیو بالا می رود توی سیمیلیتور تا ۶۰ درصد سی پی یو پر شده است.
از فانکشن scrollViewDidScroll استفاده کنین. مثلا به این صورت (البته همین هم جای کامل شدن داره من صرفا حالت کلیش رو دارم میگم.)
override func scrollViewDidScroll(scrollView: UIScrollView!) {
var offset = scrollView.contentOffset.y
var maxOffset = scrollView.contentSize.height - scrollView.frame.size.height
if (maxOffset - offset) <= 40 {
loadSegment(items.count, size: PageSize-1)
}
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .