آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

ریلود بعد از آخرین آیتم collection view

شهریار توکلی  9 سال پیش  9 سال پیش
0 0

درود خدمت شما دوستان گرامی .  

اگر بخواهیم به صورت یک جا کل 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 را رفرش کند . و هیچ داده ای واکشی نشود . چون چیزی وجود ندارد  پشت هم رفرش شده و به شدت مصرف سی پیو بالا می رود توی سیمیلیتور تا ۶۰ درصد سی پی یو پر شده است.

 

0 0
لینک (9 سال پیش)
0 0
درود آقای کاشی زاده مشکل من هم دقیقا درست نبودن کدی هست که لینک دادید ( خودم چند وقت پیش تایپیکشو زدم ) . هم می یاد بالا یعنی همون بالا مثل اینستاگرام نمی مونه مشکل اصلی منم همین هست و برخی از تداخل هایی که وجود می یاد . چطور مثل اینستا دقیقا می تونم ایجاد کنم چنین چیزی رو ؟ (9 سال پیش)
 برای این سوال 1 پاسخ وجود دارد.
پاسخ به سوال 
QUQU  9 سال پیش
+1 0

از فانکشن 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)
}
}

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .