关闭

iphone多线程-学习记录

1436人阅读 评论(0) 收藏 举报
  • 不是本人原创,只是在学习过程中遇到的问题,对其进行摘录!


  • -(BOOL) isKindOfClass: classObj 用来判断是否是某个类或其子类的实例
  • -(BOOL) isMemberOfClass: classObj 用来判断是否是某个类的实例
  • -(BOOL) respondsToSelector: selector 用来判断是否有以某个名字命名的方法(被封装在一个selector的对象里传递)
  • +(BOOL) instancesRespondToSelector: selector 用来判断实例是否有以某个名字命名的方法. 和上面一个不同之处在于, 前面这个方法可以用在实例和类上,而此方法只能用在类上.
  • -(id) performSelector: selector

     

    SEL sel = @selector (start:) ; // 指定action  

    if ([obj respondsToSelector:sel]) 

    { //判断该对象是否有相应的方法  

    [obj performSelector:sel withObject:self]; //调用选择器方法  

    使用[[UIApplication sharedApplication] keyWindow]查找应用程序的主窗口对象


    [selfperformSelectorOnMainThread:@selector(fetchedData:) withObject:datawaitUntilDone:YES];

    会创建一个新的线程实行fetchedData函数,并传入参数data,并且会等待函数退出后再继续执行。

    - (void)fetchedData:(NSData *)responseData {

    。。。

    }

    用到的类是NSThread类,这里使用detachNewTheadSelector:toTagaet:withObject创建一个线程。

    函数setupThread:(NSArray*)userInfor。通过userInfor将需要的数据传到线程中。

    函数定义:

    -(void)setupThread:(NSArray*)userInfor{

       [NSThread detachNewThreadSelector:@selector(threadFunc:) toTarget:self withObject:(id)userInfor];

    }

    - (void)threadFunc:(id)userInfor{

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

       //。。。。需要做的处理。

       //这里线程结束后立即返回

      [self performSelectorOnMainThread:@selector(endThread) withObject:nil waitUntilDone:NO];

      [pool release];

    }



    performSelectorOnMainThread通知主线程执行函数endThread。也可以使用performSelector:onThread:withObject:waitUntil 通知某线程执行线程结束后的处理

    在多线程操作中,有一个著名的错误,叫做“Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be a result of calling to UIKit from a secondary thread”,一旦出现这个错误,程序会立即crashed。

    这是由于,apple不允许程序员在主线程以外的线程中对ui进行操作(Bug?)

    而笔者在一次http异步操作中也出现过这个错误。当时使用了NSOperation进行了http异步请求,然后使用kvo模式注册观察者,当数据下载完毕后,在主线程中接收下载完毕的通知,并在observeValueForKeyPath方法中使用[tableview reloadData]更新UI。

    这样也导致了上述错误。

     

    解决的方法是使用performSelectorOnMainThread进行ui的更新:

    [self performSelectorOnMainThread:@selector(refresh) withObject:nil waitUntilDone:NO];


  • 0
    0

    查看评论
    * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
      个人资料
      • 访问:477930次
      • 积分:5841
      • 等级:
      • 排名:第4369名
      • 原创:92篇
      • 转载:88篇
      • 译文:5篇
      • 评论:57条
      博客专栏
      文章分类
      最新评论
      我的链接