ฉันมี sqlitedb ขนาดเล็กในอุปกรณ์ iOS ของฉัน เมื่อผู้ใช้กดปุ่มฉันจะดึงข้อมูลจาก sqlite และแสดงให้ผู้ใช้เห็น
ส่วนที่ดึงข้อมูลนี้ฉันต้องการทำในเธรดพื้นหลัง (เพื่อไม่บล็อกเธรดหลักของ UI) ฉันทำแบบนี้ -
[self performSelectorInBackground:@selector(getResultSetFromDB:) withObject:docids];
หลังจากดึงข้อมูลและประมวลผลเล็กน้อยฉันต้องอัปเดต UI แต่เนื่องจาก (ตามแนวทางปฏิบัติที่ดี) เราไม่ควรทำการอัปเดต UI จากเธรดพื้นหลัง ฉันเรียกว่าselector
บน mainthread เช่นนั้น -
[self performSelectorOnMainThread:@selector(showResults) withObject:nil waitUntilDone:NO];
แต่แอพของฉันขัดข้องในขั้นตอนแรก เช่นเริ่มต้นเธรดพื้นหลัง นี่ไม่ใช่วิธีเริ่มเธรดพื้นหลังใน iOS ใช่ไหม
อัปเดต 1:หลังจากที่[self performSelectorInBackground....
ฉันได้รับ stacktrace นี้ไม่มีข้อมูลอะไรเลย -
อัปเดต 2:ฉันได้ลองเริ่มเธรดพื้นหลังเช่นนั้น -
[NSThread detachNewThreadSelector:@selector(getResultSetFromDB:) toTarget:self withObject:docids];
แต่ฉันก็ยังได้รับ stacktrace เหมือนเดิม
เพื่อให้ฉันชี้แจงเมื่อฉันดำเนินการนี้กับเธรดหลักทุกอย่างราบรื่น ...
อัปเดต 3นี่เป็นวิธีที่ฉันพยายามเรียกใช้จากพื้นหลัง
- (void)getResultSetFromDB:(NSMutableArray *)toProceessDocids
{
SpotMain *mirror = [[SpotMain alloc] init];
NSMutableArray *filteredDocids = toProceessDocids;
if(![gMediaBucket isEqualToString:@""])
filteredDocids = [mirror FetchDocIdsForMediaBucketWithDocID:filteredDocids mBucket:gMediaBucket numRes:-1];
if(![gMediaType isEqualToString:@""])
filteredDocids = [mirror FetchDocIdsForMediaType:filteredDocids mediaType:gMediaType numRes:-1];
if(![gPlatform isEqualToString:@""])
filteredDocids = [mirror FetchDocIdsForPlatformID:filteredDocids platformId:@"1" numRes:-1];
self.resultSet = [mirror FetchObjectFromDocid:filteredDocids];
[filteredDocids release];
[mirror release];
[self performSelectorOnMainThread:@selector(showResults) withObject:nil waitUntilDone:NO];
return;
}
docids
นั้นยังคงอยู่
docids
retain
ฉันได้วางไว้ใน.h
ฐานะ@property (nonatomic, retain) NSMutableArray *docids;
get
; ที่ควรจะเป็นresultSetFromDB: