2011-01-06 31 views
8

Tôi có thông báo lỗi sau trong bảng điều khiển khi sử dụng NSThread "Đã cố gắng lấy khóa web từ một chủ đề khác với chuỗi chính hoặc chuỗi web. Đây có thể là kết quả của việc gọi đến UIKit từ chuỗi thứ cấp. .."cách giải quyết lỗi khi sử dụng chuỗi?

tôi có nộp mẫu mã của tôi ở đây

- (void)viewDidLoad { 

    appDeleg = (NewAshley_MedisonAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    [[self tblView1] setRowHeight:80.0]; 
    [super viewDidLoad]; 
    self.title = @"Under Ground"; 


    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 
    [NSThread detachNewThreadSelector:@selector(CallParser) toTarget:self withObject:nil]; 

} 

-(void)CallParser { 


    Parsing *parsing = [[Parsing alloc] init]; 
    [parsing DownloadAndParseUnderground]; 

    [parsing release]; 
    [self Update_View]; 
    //[myIndicator stopAnimating]; 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 




} 

here "DownloadAndParseUnderground" là phương pháp downloding dữ liệu từ feed rss và

-(void) Update_View{ 


    [self.tblView1 reloadData]; 
} 

wh phương pháp en Update_View được gọi là tableView tải lại dữ liệu và trong cellForRowAtIndexPath tạo lỗi và không hiển thị tùy chỉnh tế bào

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 


    static NSString *CellIdentifier = @"Cell"; 

    CustomTableviewCell *cell = (CustomTableviewCell *) [tblView1 dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 

     [[NSBundle mainBundle] loadNibNamed:@"customCell" 
             owner:self 
            options:nil]; 

     cell = objCustCell; 
     objCustCell = nil; 

    } 
+0

Cả hai câu trả lời đã được downvoted, tại sao? – BoltClock

+1

Đọc câu trả lời, đó là vì cả hai đều sai (hoặc không thể đọc được - điều gì đang xảy ra với 'u trên tất cả ??!?). – bbum

Trả lời

0

ok xin giải thích đúng đắn Tại sao bạn yêu cầu chủ đề trong phương pháp phân tích cú pháp? trong mã của bạn u sử dụng phương pháp tải lại bảng trong đúng trong chủ đề ....

u cant đặt bất kỳ điều mà relavent để xem bạn trong chủ đề ...

u có thể đặt duy nhất tiến trình nền như phân tích cú pháp trong đó ... nếu bạn muốn tải lại bảng sau khi phân tích cú pháp u có thể sử dụng một số giá trị cờ trong mã của bạn và sau khi phân tích bảng tải u

-1

Bạn không thể truy cập bất kỳ phần tử giao diện người dùng nào từ chuỗi nền. Bạn chắc chắn không thể tạo chế độ xem trên chuỗi nền. Sử dụng phương thức "performSelectorOnMainThread" thay cho phương thức "detachNewThreadSelector".

Tất cả tốt nhất.

3
  • nếu xảy ra sự cố, có dấu backtrace. Vui lòng đăng nó.

  • Tên phương thức bắt đầu bằng chữ cái thường, được gắn liền và không chứa dấu gạch dưới. Theo các quy ước này sẽ làm cho mã của bạn dễ đọc hơn bởi các lập trình viên iOS khác và việc học các quy ước này sẽ làm cho việc hiểu mã của lập trình viên iOS khác dễ dàng hơn.

Bạn không thể trực tiếp hoặc gián tiếp gọi các phương thức trong chuỗi chính từ chủ đề nền. Sự cố và mã của bạn đều cho biết rằng bạn đang tự do tương tác với chủ đề chính không phải là chủ đề chính.

documentation on the use of threads in iOS applications khá phong phú.

0

Hãy thử phương pháp thay đổi CallParser để

-(void)CallParser { 

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    Parsing *parsing = [[Parsing alloc] init]; 
    [parsing DownloadAndParseUnderground]; 

    [self performSelectorOnMainThread:@selector(Update_View) 
          withObject:nil 
         waitUntilDone:NO]; 
    [parsing release]; 
    [pool release]; 
} 

Và di chuyển

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 

dòng phương pháp Update_View

2

Vấn đề của bạn nên đi vì bạn nạp UIViewController của bạn từ một sợi đó không phải là chủ đề chính . Về mặt lý thuyết, khi bạn cố gắng sạc dữ liệu trước khi tải chế độ xem. Để sắp xếp việc này, bạn có thể thử làm điều này 1.Thêm một phương pháp để tải viewController bạn chỉ với một param

-(void)pushViewController:(UIViewController*)theViewController{ 
[self.navigationController pushViewController:theViewController animated:YES];} 

2.Change mã của bạn (nhận xét dưới đây) trong tải không đồng bộ của bạn để "PerformSelectorOnMainThread"

-(void)asyncLoadMyViewController 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    MyViewController *myVC = [[myVC alloc] initWithNibName:@"myVC" bundle:nil ]; 
    [self performSelectorOnMainThread:@selector(pushViewController:) withObject:myVC waitUntilDone:YES]; 
    //  [self.navigationController pushViewController:wnVC animated:YES]; 
    [wnVC release]; 
    [pool release]; 
} 
Các vấn đề liên quan